Bash不';t显示嵌套的if-else语句的结果

Bash不';t显示嵌套的if-else语句的结果,bash,if-statement,nested,Bash,If Statement,Nested,我正在尝试嵌套几个if/else语句。也许我犯了一个非常愚蠢的错误,但我无法让它发挥作用。按顺序有3个变量,其中一个随机变量为“-1” 如果其中一个是“-1”,那么下面所有的都是“-1”,所以如果FOO2是“-1”,那么FOO3也是 我需要在变量为“-1”时打印到控制台,对第一个变量进行优先级排序,因此最后一个示例应该只打印“FOO2为-1”,而不打印其他内容 这应该打印“foo3is-1”,但它没有 FOO1="2" FOO2="2" FOO3="-1" if [ ${FOO1} -eq "

我正在尝试嵌套几个if/else语句。也许我犯了一个非常愚蠢的错误,但我无法让它发挥作用。按顺序有3个变量,其中一个随机变量为“-1”

如果其中一个是“-1”,那么下面所有的都是“-1”,所以如果FOO2是“-1”,那么FOO3也是

我需要在变量为“-1”时打印到控制台,对第一个变量进行优先级排序,因此最后一个示例应该只打印“FOO2为-1”,而不打印其他内容

这应该打印“foo3is-1”,但它没有

FOO1="2"
FOO2="2"
FOO3="-1"

if [ ${FOO1} -eq "-1" ]
then
    if [ ${FOO2} -eq "-1" ]
    then
        if [ ${FOO3} -eq "-1" ]
        then
            echo "FOO3 is -1"
        else 
            echo "FOO2 is -1"
        fi
    else 
        echo "FOO1 is -1"
    fi
fi

您的第一个测试为false,并且没有
else
子句,所以除了第一个测试之外,没有任何东西可以运行

这种逻辑的更理智的版本可能更像:

FOO1="2"
FOO2="2"
FOO3="-1"

if [ "${FOO1}" -eq -1 ]; then
    echo "FOO1 is -1"
elif [ "${FOO2}" -eq -1 ]; then
    echo "FOO2 is -1"
elif [ "${FOO3}" -eq -1 ]; then
    echo "FOO3 is -1"
fi
…或者,如果出于某种原因确实想保留嵌套:

FOO1="2"
FOO2="2"
FOO3="-1"

if [ "${FOO1}" -eq -1 ]; then
    echo "FOO1 is -1"
else
    if [ "${FOO2}" -eq -1 ]; then
        echo "FOO2 is -1"
    else
        if [ "${FOO3}" -eq -1 ]; then
            echo "FOO3 is -1"
        fi
    fi
fi

您的第一个测试为false,并且没有
else
子句,所以除了第一个测试之外,没有任何东西可以运行

这种逻辑的更理智的版本可能更像:

FOO1="2"
FOO2="2"
FOO3="-1"

if [ "${FOO1}" -eq -1 ]; then
    echo "FOO1 is -1"
elif [ "${FOO2}" -eq -1 ]; then
    echo "FOO2 is -1"
elif [ "${FOO3}" -eq -1 ]; then
    echo "FOO3 is -1"
fi
…或者,如果出于某种原因确实想保留嵌套:

FOO1="2"
FOO2="2"
FOO3="-1"

if [ "${FOO1}" -eq -1 ]; then
    echo "FOO1 is -1"
else
    if [ "${FOO2}" -eq -1 ]; then
        echo "FOO2 is -1"
    else
        if [ "${FOO3}" -eq -1 ]; then
            echo "FOO3 is -1"
        fi
    fi
fi

提示:试着运行
bash-xyourscript
,看看它实际执行的是什么……现在已经为您完成了。因为
[${FOO1}-eq“-1”]
为false,并且所有其他代码都在
then
子句中(它根本没有
else
子句!),所以这些代码都无法运行。顺便说一句,您引用的东西完全错误。没有理由在
[${FOO1}-eq“-1”]
中引用
“-1”
,但是您应该引用
“${FOO1}”
来阻止它在生成传递给
[
命令(
/usr/bin>的参数列表时被字符串拆分和全局展开/[
,顺便说一句,也是
/usr/bin/test
;bash作为性能优化提供的那些可执行文件及其shell内置等价物都符合上一节的规范)。(顺便说一句,当我们在这里进行kibiting时,所有caps名称都用于对shell或操作系统有意义的变量,而至少有一个小写字符的名称则保留给应用程序使用;请参阅的相关规范,记住shell和环境变量共享一个名称空间——设置前者将覆盖后者在冲突中,因此相同的约定适用于两者。)(这里也没有特别的理由选择
“${foo}”
而不是
“$foo”
;在没有常数或参数化展开的情况下,这两个函数完全等效;而与大括号不同,使用引号或不这样做会对正确性产生非常实际的影响).提示:尝试运行
bash-xyourscript
以查看它实际执行的内容…在上已经为您完成了此操作。因为
[${FOO1}-eq“-1”]
为false,而所有其他代码都在
then
子句中(它根本没有
else
子句!),这些代码都没有运行过。顺便说一句,你引用的完全是错误的。没有理由在
[${FOO1}-eq“-1”]
中引用
“-1”
,但是你应该引用
“${FOO1}”
来阻止它在生成传递给
[
命令的参数列表时被拆分和全局展开(
/usr/bin/[
,顺便说一句,也是
/usr/bin/test
;bash作为性能优化提供的那些可执行文件及其shell内置等价物都符合处的规范)。(顺便说一句,当我们在这里进行kibiting时,所有caps名称都用于对shell或操作系统有意义的变量,而至少有一个小写字符的名称则保留给应用程序使用;请参阅的相关规范,记住shell和环境变量共享一个名称空间——设置前者将覆盖后者在冲突中,因此相同的约定适用于两者。)(这里也没有特别的理由选择
“${foo}”
而不是
“$foo”
;在没有常数或参数化展开的情况下,这两个函数完全等效;而与大括号不同,使用引号或不这样做会对正确性产生非常实际的影响)。