我试图在 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_ind
0
0
此外,外壳&&
和||
操作符有平等的优先级,因此a && bb || c && d
行为类似于( (a && bb) || c) && d
,这可能不是您想要的。
因此,您需要在/]
之前添加结束符,并手动对命令进行分组:&&
||
if { [ ... ] && [ ... ]; } ||
{ [ ... ] && [ ... ] && [ ... ]; }; then ...
或者使用括号,这不需要;
最后的麻烦,但启动子 shell,这会造成轻微的性能损失:
if ( [ ... ] && [ ... ] ) ||
( [ ... ] && [ ... ] && [ ... ] ); then ...
或者切换到使用[[
测试(在 Bash/ksh/zsh 中),这是shell 语法并适用于不同的规则并支持&&
/ ||
。
看: