Shell 脚本 If 语法错误

Shell 脚本 If 语法错误
if ($(ipcs|grep test|wc -l)=630); then

echo "Shared Memory check passed"
fi

我收到以下错误:

./Test1: line 25: 636=630: command not found

答案1

一些语法错误

bash 中 'if' 结构的基础如下:

if [ expression ];
then
    # code if 'expression' is true.
fi

这是更正后的版本

if [ "$(ipcs|grep test|wc -l)" -eq 630 ]; then 
    echo "Shared Memory check passed"
fi

或使用[[…]]to 来防止不使用双引号对变量值进行分词

if [[ $(ipcs|grep test|wc -l) -eq 630 ]]; then 
    echo "Shared Memory check passed"
fi

或更好

if [[ $(ipcs|grep -c test) -eq 630 ]]; then 
    echo "Shared Memory check passed"
fi

答案2

本质上,有多种方法可以构造if条件bash;其中一种在 AB 的答案中概述了;另一种可能是您尝试使用的,它涉及使用双括号,这是一种以bash更像 C 风格的方式操作表达式/变量的方法,并且根据其定义,它需要双括号才能工作(请注意,例如对于字符串比较,这不起作用):

if (($(ipcs|grep test|wc -l)==630)); then
    echo "Shared Memory check passed"
fi

有关“双括号结构”的更多信息

答案3

要添加另一个选项:您可以完全省去方括号和圆括号,而是使用test内置函数:

if test $(ipcs|grep test|wc -l) -eq 630; then 
    echo "Shared Memory check passed"
fi

内置函数[本质上是内置函数的别名test,只是它需要一个额外的参数:]

这也说明了 不是[语句的一部分if。内置[和二进制/usr/bin/[只是像其他命令一样的命令,例如lsgrep

语句执行和if之间的命令。如果最后一个命令的退出代码为,则执行 之后的命令。如果命令的参数(根据某些语法规则将其解释为逻辑表达式)计算结果为真,则命令退出。ifthen0then[0

事实上,你可以if完全消除并只使用[命令,如惯用语:

[ $(ipcs|grep test|wc -l) -ne 630 ] || echo "..."

相关内容