缺少操作员问题

缺少操作员问题

我试图在 If 条件下执行 OR 逻辑

condition 1 => warning ="" and err_code !=1
OR
condition 2 => threshold =1 and threshold_load_ind=Y and err_code!=1

这引发了操作员级别的问题。 if 代码中缺少什么

if [  "$warn" != ""  &&  "$err_ind" != 1  ] || [  $thres_err_ind == 1   &&  $thres_load_ind == "Y"  &&  $err_ind != 1  ];then

第 860 行的错误代码

[860]: [: ']' missing
[860]: [: ']' missing

答案1

[是常规命令(有一个有趣的名字),不是shell 语法的一部分。只是为了让它看起来像一个语法元素,令人困惑,它希望将]其视为最后一个参数。但是&&||是 shell 语法的一部分,它们分隔命令。因此,您的 if 语句有五个命令,标记如下:

if [ "$warn" != ""  && "$err_ind" != 1  ] ||
   1^^^^^^^^^^^^^^^    2^^^^^^^^^^^^^^^^^

   [ $thres_err_ind == 1 && $thres_load_ind == "Y" && $err_ind != 1 ];
   3^^^^^^^^^^^^^^^^^^^^    4^^^^^^^^^^^^^^^^^^^^^    5^^^^^^^^^^^^^^

第一个运行时使用三个参数,其中包含、和一个空字符串[的内容。没有,所以命令抱怨。由于失败,下面的命令不会运行,但后面的命令会运行,并出于类似的原因进行抱怨。 (如果其他人会运行,他们可能会给你“命令未找到”错误,因为变量位于命令位置,并且如果例如包含,shell将尝试运行命令。)$warn!=][&&||err_ind00

此外,外壳&&||操作符有平等的优先级,因此a && bb || c && d行为类似于( (a && bb) || c) && d,这可能不是您想要的。

因此,您需要在/]之前添加结束符,并手动对命令进行分组:&&||

if { [ ... ] && [ ... ]; } ||
   { [ ... ] && [ ... ] && [ ... ]; }; then ...

或者使用括号,这不需要;最后的麻烦,但启动子 shell,这会造成轻微的性能损失:

if ( [ ... ] && [ ... ] ) ||
   ( [ ... ] && [ ... ] && [ ... ] ); then ...

或者切换到使用[[测试(在 Bash/ksh/zsh 中),这shell 语法并适用于不同的规则并支持&&/ ||

看:

相关内容