gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:03:39 27 4
gpt4 key购买 nike

我在 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 文件名进行调试。但是,它在比较时没有显示任何值(value)(因为我没有使用 $ 符号)。

shell 如何决定哪个更大,反之亦然?
内部如何运作?

谢谢。

最佳答案

值得注意的是,您可以在没有 $ 的情况下使用它如果您在数字上下文中进行比较。

在 bash 中:

if (( a > b )); then
echo "a is greater"
else
echo "b is greater"
fi

...应该是正确的,如 (( )) (双括号)进入一个数字上下文,在该上下文中所有文本字符串都被视为变量并自动取消引用(并且在其中诸如 >< 之类的运算符具有其典型的算术含义,而不是执行重定向)。

您现在所做的很大程度上取决于实现。 [ a '>' b ]将是字母之间的字典比较 ab . [ 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 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

关于shell - 为什么 [ a -gt b ] (不是 [ "$a"-gt "$b"])似乎有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16170605/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com