我在unix shell脚本中有一个问题.让我用非常简单的例子问你.
假设,我正在获取用户输入并比较两个数字.
echo "Enter the first number"
read a
echo "Enter the second number"
read b
if [ a -gt b ]---------------------->I have not used $ before variable name.
then
echo "a is greater"
else
echo "b is greater"
fi
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我应该使用$来获取变量的值.错了,我忘记了.不过,它给了我正确的结果,如何以及为什么?
我尝试使用sh -x filename进行调试.但是,它在比较时没有显示任何价值(因为我没有使用$符号).
shell如何决定哪个更大,反之亦然?它内部如何工作?
谢谢.
值得注意的是,你可以使用这个没有$,如果你没有在数值方面的比较.
在bash中:
if (( a > b )); then
echo "a is greater"
else
echo "b is greater"
fi
Run Code Online (Sandbox Code Playgroud)
...是正确的,因为(( ))(双括号)进入一个数值范围内,所有的文本字符串被视为变量,并自动取消引用(和其内运营商如>和<有其典型的算术含义,而不是执行重定向).
你现在正在做的是严重依赖于实现.[ a '>' b ]将是字母a和字母之间的字母比较b.[ a -gt b ]是算术测试.
许多炮弹根本不允许这样做.例如:
$ a=2; b=3; [ a -gt b ]; echo $?
-bash: [: a: integer expression expected
2
Run Code Online (Sandbox Code Playgroud)
值得注意的是,这在bash的[[ ]]测试上下文中是不同的(它不带有POSIX语义[ ]).在那里,你正在做的事情确实有效,尽管它比(( ))表格更难阅读:
$ a=2; b=3; [[ a -gt b ]]; echo $?
1
$ a=3; b=2; [[ a -gt b ]]; echo $?
0
Run Code Online (Sandbox Code Playgroud)
如果你只限于POSIX sh的,你没有(( )),但你也有$(( )),你可以用几乎相同的方式:
$ a=2; b=3; result=$(( a > b ? 1 : 0 )); echo "$result"
0
$ a=3; b=2; result=$(( a > b ? 1 : 0 )); echo "$result"
1
Run Code Online (Sandbox Code Playgroud)