在Bash中比较两个变量的while循环

5

我正在尝试在嵌套的while循环中比较两个变量,但出现以下问题:

[: 1, : 需要整数表达式。

我的代码:

#!/bin/bash

a="10",b="5"
i="1", j="1"
while [ $i -ne $a ]
do
        while [ $j -ne $b ]
        do
                echo"In Child Loop $j Times"
                ((j++))
        done
        j="1"
        echo"In Parent Loop $i Times"
        ((i++))
done

请使用分号而不是逗号来分隔变量,例如:a="10";b="5" - jan
在这种情况下,我建议使用-lt而不是-ne。或者用(( ... < ... ))替换两个[ ... ]测试。由于((i++)),该脚本已经不符合POSIX标准。 - Henk Langeveld
有没有任何答案对您有帮助?如果有,请接受它。 - striving_coder
3个回答

3
你有两个主要问题。第一个是在字符串的开头和echo之间忘记留空格,第二个是逗号不是bash中有效的行结束符。Bash使用分号作为行结束符。这意味着如果你想将两个赋值放在同一行上,你必须在它们之间放一个分号,而不是逗号。改动后的代码如下:
#!/bin/bash

a="10"
b="5"
i="1"
j="1"

while [ $i -ne $a ]
do
    while [ $j -ne $b ]
    do
        echo "In Child Loop $j Times"
        ((j++))
    done
    j="1"
    echo "In Parent Loop $i Times"
    ((i++))
done

输出:

$ bash nestedtest.sh
In Child Loop 1 Times
In Child Loop 2 Times
In Child Loop 3 Times
In Child Loop 4 Times
In Parent Loop 1 Times
In Child Loop 1 Times
In Child Loop 2 Times
In Child Loop 3 Times
In Child Loop 4 Times
In Parent Loop 2 Times
In Child Loop 1 Times
In Child Loop 2 Times
In Child Loop 3 Times
In Child Loop 4 Times
In Parent Loop 3 Times
In Child Loop 1 Times
In Child Loop 2 Times
In Child Loop 3 Times
In Child Loop 4 Times
In Parent Loop 4 Times
(snip)

此外,由于bash没有“类型变量”,因此存在一些不确定性,即变量是应该被视为数字还是字符串。类型由上下文决定。但是,如果在第一次使用变量之前使用declare声明变量,您可以让bash知道您打算如何使用变量。例如:
declare -i a="10" b="5" i="1" j="1"

注意: 在此,您可以将多个声明放在同一行上,只需通过空格分隔即可。

另外,如果你收到了一个 "[: 1, : integer expression expected" 错误。通常有两个原因:(1) 变量还未定义,或者 (2) 它不包含数字。避免这种情况的方法是始终确保在测试变量之前初始化它们。(您在这里做到了,只是遇到了逗号问题)。

最后,尽管对于数字值并不是必需的,但最好为您的变量加上双引号。这将在以后许多时候为您节省大量麻烦。


1

不应该使用逗号分隔两个字符串赋值,因为","会被添加到第一个变量的值中。例如:

a="10", b="5"
echo $a
> 10,

相反,每个任务都在自己的行上:
a="10"
b="5"
i="1"
j="1"

另外,您可以在初始化行中去掉逗号:

a=10 b=5
i=1 j=1

这是“shell”编程。 - jan

1
您可以将多个赋值语句组合在一起,仅用空格分隔。只需用空格替换逗号即可:
a="10" b="5"
i="1" j="1"

甚至是:

或者:

a="10" b="5" i="1" j="1"

你还可以删除引号并减少混乱:

a=10 b=5 i=1 j=1

但是需要注意的是,保持内容易读。


Shell有一个规则用于处理前缀命令的赋值。 对于一个外部命令,该命令将在分配的变量运行其自己的环境中。

对于一个内部命令,赋值将是当前进程的永久性, 因此变量及其值将在命令完成后持续存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接