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

在while循环BASH中比较两个变量,bash,Bash,我试图在嵌套的循环中比较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"

我试图在嵌套的
循环中比较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

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

a="10", b="5"
echo $a
> 10,
相反,每项作业都在自己的行上进行:

a="10"
b="5"
i="1"
j="1"
或者,您可以删除初始化行中的逗号:

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

您有2主要问题。(1)您忘记在
echo
和字符串开头之间留空格,以及(2)如前所述,逗号不是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没有
类型化变量
,因此变量应被视为数字还是字符串可能存在歧义。类型由上下文决定。但是,如果您
在首次使用变量之前声明该变量,则可以让bash知道您打算如何使用该变量。例如:

declare -i a="10" b="5" i="1" j="1"
注意:在这里,您可以在一行上放置多个声明,仅用空格分隔

此外,如果收到
“[:1,:integer表达式应为”
错误。这通常是由于以下两个原因之一造成的。(1)变量尚未定义,或(2)它不包含数字。避免这种情况的方法是始终确保在测试变量之前初始化变量(您在这里初始化了变量,只是遇到了
逗号问题)

最后,虽然在数值上不是必需的,但最好是
双引号
您的变量。这将为您省去很多麻烦。

您可以组合多个赋值,仅用空格分隔。 只需将逗号替换为空格:

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有一个规则,用于处理以命令为前缀的赋值。 对于外部命令,该命令将在其自己的环境中使用指定的变量运行

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

用分号而不是逗号分隔变量,即,在这种情况下,我建议使用
-lt
覆盖
-ne
。或者用
(…<)替换这两个
[…]
测试
。由于
((i++)
)的原因,脚本已经不符合POSIX。这些答案有帮助吗?如果有,请接受。这是“shell”编程