If 条件运算符:提供未声明变量时需要一元运算符

If 条件运算符:提供未声明变量时需要一元运算符

我正在运行下面的脚本,该脚本引发一元运算符问题的错误。在主 shell 脚本程序中,我将在下面使用这个existing_sum_check 变量,但无论如何我都想执行此检查。我怎样才能避免这个错误?

程序:

#!/bin/sh

latest_sum_check=10101;

if [ $latest_sum_check != $EXISTING_SUM_CHECK ]; then
    EXISTING_SUM_CHECK = $latest_sum_check;

    echo $EXISTING_SUM_CHECK;
    echo "Please process";
else
    echo "Do not process"
fi

答案1

你基本上已经有了[ something != $bar ]

如果$bar为空,则变为if [ something != ],这当然不起作用,因为相等测试需要两个操作数。尽管 Bash 的test/至少[有一种有趣的方式来说明这一点:显然它检查参数的数量,并且由于只有两个,因此期望第一个是一元运算符。没有something一个,所以它抱怨。

所以,给变量加上引号

if [ "$latest_sum_check" != "$EXISTING_SUM_CHECK" ]; then ...

这将运行一个EXISTING_SUM_CHECK带有等号的命令以及来自变量扩展的任何内容作为参数:

 EXISTING_SUM_CHECK = $latest_sum_check;

shell 中的变量赋值不会在它们周围占用空格。

答案2

由于存在未声明的变量 $EXISTING_SUM_CHECK,这是测试的错误情况。您应该再进行一次检查,例如:

if [ -z $EXISTING_SUM_CHECK ]; then
    EXISTING_SUM_CHECK=$latest_sum_check
elif [ $latest_sum_check != $EXISTING_SUM_CHECK ]; then

这使用一元运算来检查字符串的长度是否为零。 != 要求测试两边都具有非空值。

解决这个问题的另一种方法可以是:

if [ "X${latest_sum_check}" != "X${EXISTING_SUM_CHECK}" ]; then

如果变量未设置、为 null 或“”,则强制两个值的值至少为 X。

另请注意,通常如果您要比较两个数字,建议使用 -ne 而不是 !=,因为 != 是为字符串保留的。但是 -ne 仅适用于数字 [0-9],不适用于十六进制比较,例如 md5sum 结果。

相关内容