对于下面的脚本,我希望输出为msg_y and msg_z
。但它正在打印msg_x and msg_z
。有人可以向我解释发生了什么吗?
#!/bin/bash
set -x
vr=2
echo $vr
if [ $vr > 5 ]
then
echo "entered 1st if"
echo "msg_x"
echo "out of 1st if"
if [ $vr < 8 ]; then
echo "in of 2nd if"
echo "msg_y"
else
echo "msg_z"
fi
else
if [ $vr > 1 ]; then echo "msg_y"
else echo "msg_z"
fi
fi
答案 0 :(得分:6)
此表达式
[ $vr > 5 ]
被解析为输出重定向;现在检查你是否有一个名为“5”的文件。输出重定向是真空的。请注意,在测试表达式中引用参数的通常警告在这里没有帮助(但它仍然是一个好主意)。
您可以转义>
,以便在测试命令中将其视为运算符:
if [ "$vr" \> 5 ]; then
或者您可以使用整数比较运算符-gt
if [ "$vr" -gt 5 ]; then.
由于您使用的是bash
,因此可以使用更强大的功能
条件表达式
if [[ $vr > 5 ]]; then
或
if [[ $vr -gt 5 ]]; then
或使用算术表达式
if (( vr > 5 )); then
进行比较(同样适用于其他人)。
注意:虽然我展示了如何使>
作为比较运算符工作,即使被整数包围,也不要这样做。大多数情况下,你不会得到你想要的结果,因为参数是按字典顺序进行比较,而不是数字。尝试[ 2 \> 10 ] && echo What?
使用正确的整数比较运算符(-gt
等)或使用算术表达式。