我正在运行下面的脚本,该脚本引发一元运算符问题的错误。在主 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 结果。