比较while循环BASH中的两个变量

时间:2014-11-30 03:13:25

标签: bash

我试图在嵌套的while循环中比较bash中的两个变量,我遇到了问题:

  

[: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

3 个答案:

答案 0 :(得分:1)

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

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

相反,每个作业都在自己的行上进行:

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

或者,您可以删除初始化行中的逗号:

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

答案 1 :(得分:1)

您有 2 主要问题。 (1)您忘记在echo和字符串开头之间留出空格,(2)指出,逗号为不是 bash中的有效end of line说明符。 Bash使用semi-colon作为end of line说明符。这意味着如果您想在同一行上放置2个作业,则必须在它们之间加;,而不是,。随着代码的更改:

#!/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没有typed variables,因此变量应该被视为数字还是字符串可能会有歧义。类型由上下文确定。但是,如果变量在第一次使用之前declare,您可以让bash知道您打算如何使用变量。 E.g:

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

注意:在这里可以在单行上放置多个声明,只需用空格分隔。

此外,如果您收到"[: 1, : integer expression expected"错误。这通常是由于两个原因之一。 (1)该变量尚未定义,或(2)它不包含数字。避免这种情况的方法是在测试之前始终确保初始化变量。 (你在这里做过,你刚遇到comma问题)。

最后,虽然数值不需要,但double-quote变量是个好主意。这将为您节省许多麻烦。

答案 2 :(得分: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具有处理前缀命令的赋值的规则。 对于外部命令,该命令将使用 中自己的环境中指定的变量运行。

对于内部命令,对于当前进程,分配将是永久性的, 因此,在命令完成后,变量及其值将保持不变。