首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >[[]]若条件为可变逻辑算子

[[]]若条件为可变逻辑算子
EN

Stack Overflow用户
提问于 2022-01-28 08:59:12
回答 2查看 87关注 0票数 1

我在file1中有以下文本:

代码语言:javascript
复制
aaa common-criteria policy POLICY1

  min-length 8 

  max-length 16

  numeric-count 1

  upper-case 3

  lower-case 2

  char-changes 4

!

以及file2中的以下文本:

代码语言:javascript
复制
aaa common-criteria policy POLICY2

  min-length 1

  max-length 127 

  char-changes 4

!

根据策略中的阈值,我想检查两个文件中的所有值是否正确。我创建了两个具有阈值的数组,以便将每个值与每个文件中的值进行比较。

代码语言:javascript
复制
declare -a COM=("min-length" "max-length" "upper-case" "lower-case" "numeric-count")
declare -a OPE=("-ge" "-le" "-ge" "-ge" "-ge")
declare -a VAL=("8" "16" "1" "1" "1")

我创建了一个循环来根据VAL(i)中的值检查文件中的每个值。

代码语言:javascript
复制
for ((i=0; i<${#COM[@]}; i++)); do
    THRESHOLD=$(grep ${COM[$i]} FILE | awk -F " " '{print $2}') --> to get value VAL(i) for each comand COM(i)

if [[ $THRESHOLD -ge "${VAL[$i]}" ]]; then echo "OK"; else echo "KO"; fi

done

下一步应该是在if条件下将"-ge"更改为OPE(i),允许以正确的方式分析每个命令,因为“最大长度”值应该小于阈值。如果我将"-ge"更改为${OPE[$i]} if [[ "$THRESHOLD" "${OPE[$i]}" "${VAL[$i]}" ]],则此消息将导致进程失败:

条件二进制运算符期望语法错误接近${OPE$I}

您知道" if“条件是否具有这种灵活的语法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-28 09:08:13

在展开变量之前,[[ ... ]]是以一种特殊的方式被解析的,因此这是不可能的(这也是为什么您不需要重复引用[[ ... ]]中的变量)。但是您可以使用旧的[ ... ],它遵循正常的解析规则。

代码语言:javascript
复制
op==
[ x "$op" x ]  # ok
票数 1
EN

Stack Overflow用户

发布于 2022-01-28 11:38:24

对于作为变量传递的参数,可以使用test 命令

test命令示例:

代码语言:javascript
复制
v1=1; op=" -eq "; v2=1
if test "$v1 $op $v2"; then echo true; else echo false; fi
true

v1=1; op=" -eq "; v2=0
if test "$v1 $op $v2"; then echo true; else echo false; fi
false

建议在gawk脚本中使用关联数组,这是Linux机器中的标准awk

script.awk

代码语言:javascript
复制
function boolExprTest(expr) { # function to test bool exression provided as input string
  split(expr, exprToken); # split input string into tokens
  # return boolean expression result for each 2nd token
  if (exprToken[2] == ">=") return exprToken[1] >= exprToken[3];
  if (exprToken[2] == "<=") return exprToken[1] <= exprToken[3];
  if (exprToken[2] == ">")  return exprToken[1] > exprToken[3];
  if (exprToken[2] == "<")  return exprToken[1] <  exprToken[3];
  if (exprToken[2] == "==")  return exprToken[1] ==  exprToken[3];
}

BEGINFILE { # at the beging of each input file read
  # define boolean expression templates using associative arry boolExpr[]
  boolExpr["min-length"] = " >= 8";
  boolExpr["max-length"] = " <= 16";
  boolExpr["upper-case"] = " >= 1";
  boolExpr["lower-case"] = " >= 1";
  boolExpr["numeric-count"] = " >= 1";
  # define current file's results using associative arry currResults[]
  currResults["min-length"] = "undefined";
  currResults["max-length"] = "undefined";
  currResults["upper-case"] = "undefined";
  currResults["lower-case"] = "undefined";
  currResults["numeric-count"] = "undefined";
  # print file seperator
  print "---------------+---------------+-------------";
}

# for each line in current file 
$1 in boolExpr { # if 1st field is a member in boolExpr[]
  currResults[$1] = "fail"; # default result is fail in currResults[]
  if (boolExprTest($2 boolExpr[$1])) { # used function boolExprTest () to test "$2 boolExpr[$1]"
    currResults[$1] = "pass"; # set pass result in currResults[]
  }
}

ENDFILE { # at the end of each input file read
  for (argument in currResults) { # iterate results
    #fromat print the results
    printf("%-15s|%-15s|%s\n", FILENAME, argument, currResults[argument]);
  }
}

产出:

代码语言:javascript
复制
$ awk -f script.awk input.*.txt
---------------+---------------+-------------
input.1.txt    |numeric-count  |pass
input.1.txt    |max-length     |pass
input.1.txt    |lower-case     |pass
input.1.txt    |min-length     |pass
input.1.txt    |upper-case     |pass
---------------+---------------+-------------
input.2.txt    |numeric-count  |undefined
input.2.txt    |max-length     |fail
input.2.txt    |lower-case     |undefined
input.2.txt    |min-length     |fail
input.2.txt    |upper-case     |undefined
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70891099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档