我在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在本例中,我应该使用$来获取变量的值。不小心,我忘了。尽管如此,它仍然给了我正确的结果,如何以及为什么?
我尝试使用sh -x文件名进行调试。但是,在比较时,它没有显示任何值(因为我没有使用$ sign)。
shell如何决定哪个更大,反之亦然?它在内部是如何工作的?
谢谢。
发布于 2013-04-23 21:31:05
值得注意的是,如果您在数值上下文中进行比较,则可以在不使用$的情况下使用它。
在bash中:
if (( a > b )); then
echo "a is greater"
else
echo "b is greater"
fi...would是正确的,因为(( )) (双括号)进入一个数值上下文,在该上下文中,所有文本字符串都被视为变量并自动解除引用(在该上下文中,>和<等运算符具有典型的算术含义,而不是执行重定向)。
您现在所做的是严重依赖于实现的。[ a '>' b ]将是字母a和b之间的词法比较。[ a -gt b ]是一种算术测试。
许多shell根本不允许这样做。例如:
$ a=2; b=3; [ a -gt b ]; echo $?
-bash: [: a: integer expression expected
2值得注意的是,这在bash的[[ ]]测试上下文(没有携带[ ]的POSIX语义)中是不同的。在这里,您所做的实际上是有效的,尽管它比(( ))表单更难阅读:
$ a=2; b=3; [[ a -gt b ]]; echo $?
1
$ a=3; b=2; [[ a -gt b ]]; echo $?
0如果您仅限于POSIX,那么您没有(( )),但是您有$(( )),您可以几乎以相同的方式使用它:
$ a=2; b=3; result=$(( a > b ? 1 : 0 )); echo "$result"
0
$ a=3; b=2; result=$(( a > b ? 1 : 0 )); echo "$result"
1发布于 2013-04-23 21:53:09
有一个简单的解释说明为什么您的测试看起来是有效的:它盲目地执行else子句。
[ ... ]内置程序无法向调用者报告错误,除非以非零退出状态退出。顺便说一下,非零退出状态也用来表示"false“。这意味着if无法区分对其条件的错误评估和错误评估,这就是为什么您的比较总是首选else分支,因此看起来是有效的。您可以通过恢复参数来轻松地测试它:
$ if [ b -gt a ]
then
echo "b is greater"
else
echo "a is greater"
fi
dash: 11: [: Illegal number: b
a is greater请注意,对于if语句而言,打印到标准错误的错误消息只是测试命令的副作用,完全被忽略。
https://stackoverflow.com/questions/16170605
复制相似问题