意料之外的扩张
脚本中可能会出现仅间歇性出现的错误。 有时脚本会运行良好,有时会由于扩展的结果而失败。 如果我们返回丢失的分号并更改 数 对于一个空变量,我们
可以证明:
#!/斌/庆典
# 麻烦:演示常见错误的脚本
数字=
如果 [ $number = 1 ]; 然后
echo "数字等于 1。" 别的
echo "数字不等于 1。"
fi
#!/斌/庆典
# 麻烦:演示常见错误的脚本
数字=
如果 [ $number = 1 ]; 然后
echo "数字等于 1。" 别的
echo "数字不等于 1。"
fi
使用此更改运行脚本会导致输出:
[我@linuxbox ~]$ 麻烦
/home/me/bin/trouble: line 7: [:=: 一元运算符预期的数字不等于 1。
[我@linuxbox ~]$ 麻烦
/home/me/bin/trouble: line 7: [:=: 一元运算符预期的数字不等于 1。
我们得到这个相当神秘的错误信息,然后是第二个的输出 回音 命令。 问题是扩容 数 内的变量 测试 命令。 当命令:
[$数字=1]
[$数字=1]
经历扩展 数 为空,结果是这样的:
[ = 1]
[ = 1]
这是无效的,并产生错误。 这 = 运算符是一个二元运算符(它需要在每一侧都有一个值),但是缺少第一个值,所以 测试 命令需要一元运算符(例如 -z) 反而。 此外,由于 测试 失败(由于错误), if 命令接收一个非零退出代码并相应地采取行动,第二个 回音 命令被执行。
这个问题可以通过在第一个参数周围添加引号来纠正 测试
命令:
[“$数字”= 1]
[“$数字”= 1]
然后当发生扩展时,结果将是这样的:
[ "" = 1 ]
[ "" = 1 ]
这会产生正确数量的参数。 除了空字符串之外,在值可以扩展为多字字符串的情况下(如包含嵌入空格的文件名),还应使用引号。