为什么[a -gt b](不是["$ a"-gt"$ b"])似乎有效?

Vic*_*cky 2 unix shell sh

我在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如何决定哪个更大,反之亦然?它内部如何工作?

谢谢.

Cha*_*ffy 6

值得注意的是,你可以使用这个没有$,如果你没有在数值方面的比较.

在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)