Bash语法问题中的if语句产生正确的答案,而正确的代码显示错误的答案

时间:2017-10-01 00:32:16

标签: bash if-statement conditional

我对bash脚本很新,并且正在努力使用一些if语句语法。

我目前写了以下循环:

for (( i = 2; i < $# - 1; i++)); do
    if [ $i -ne 0]; then
        if [ $i -ne 1]; then
            echo "$i was not 1 or 0. Please correct this then try again."
            exit 1;
        fi
    fi
done

这段代码应该测试第一个之后的参数是1还是0。

打印出以下错误:

./blink.sh: line 36: [: missing `]'
./blink.sh: line 36: [: missing `]'

......之后代码实际运行正常(因此错误不会导致程序失效)。

然而,我的理解是,在bash中,你在if语句中的表达式之前和之后放置空格。所以这个:

if [ $i -ne 0]; then

成为:

if [ $i -ne 0 ]; then

但是,运行此代码会产生以下结果:

2 was not 1 or 0. Please correct this then try again.

我遇到的主要问题源于不了解如何间接引用执行命令提供的位置参数。因此,我很困惑,必须改变什么语法来调用参数指向的对象(在这种情况下,希望是1或0)而不是参数本身的位置(参数1,2,3。 ..)。

谢谢!

编辑:更改问题以更好地符合@randomir提供的建议,并清除实际问题所需的内容

1 个答案:

答案 0 :(得分:1)

基于:

  

这段代码应该测试第一个之后的参数是1还是0。

我假设您正在尝试访问位置参数$2$3等。要使for循环解决方案正常工作,您必须使用{{3 }:${!i}(参见indirect reference)。例如,这应该有效:

#!/bin/bash
for (( i = 2; i <= $#; i++ )); do
    if [[ ${!i} -ne 0 ]]; then
        if [[ ${!i} -ne 1 ]]; then
            echo "$i was not 1 or 0. Please correct this then try again."
            exit 1;
        fi
    fi
done

请注意i2运行到参数数量$#。另外,请注意使用推荐且不易出错的[[ .. ]]代替[ .. ](否则您必须编写[ "${!i}" -ne 0 ]等)。

更简单的解决方案,避免了不必要的间接引用,如下所示:

#!/bin/bash
while [[ $2 ]]; do
    if (( $2 != 0 && $2 != 1 )); then
        echo "$2 is neither 0, nor 1"
        exit 1
    fi
    shift
done

我们开始检查第二个参数($2),使用第二个参数的值的算术表达式(( expr ))测试,以及每次迭代时左边的shell parameter expansion个位置参数(现在$3变为$2等。)