bash shell脚本中的意外输出

its*_*tsh 2 linux bash shell

对于下面的脚本,我期待输出 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
Run Code Online (Sandbox Code Playgroud)

che*_*ner 6

这个表达

[ $vr > 5 ]
Run Code Online (Sandbox Code Playgroud)

被解析为输出重定向; 现在检查你是否有一个名为"5"的文件.输出重定向是真空的.请注意,在测试表达式中引用参数的通常警告在这里没有帮助(但它仍然是一个好主意).

您可以转义>它,以便它在test命令中被视为运算符:

if [ "$vr" \> 5 ]; then
Run Code Online (Sandbox Code Playgroud)

或者您可以使用整数比较运算符 -gt

if [ "$vr" -gt 5 ]; then.
Run Code Online (Sandbox Code Playgroud)

由于您正在使用bash,您可以使用更健壮的条件表达式

if [[ $vr > 5 ]]; then
Run Code Online (Sandbox Code Playgroud)

要么

if [[ $vr -gt 5 ]]; then
Run Code Online (Sandbox Code Playgroud)

或使用算术表达式

if (( vr > 5 )); then
Run Code Online (Sandbox Code Playgroud)

进行比较(同样适用于其他人).


注意:虽然我展示了>即使在整数包围时如何将工作作为比较运算符,但请不要这样做.大多数情况下,你不会得到你想要的结果,因为参数是按字典顺序而不是数字地进行比较.尝试[ 2 \> 10 ] && echo What?使用正确的整数比较运算符(-gt等)或使用算术表达式.