BASH while 循环中比较两个变量

Jin*_*ro9 5 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
Run Code Online (Sandbox Code Playgroud)

Dav*_*ica 3

您有两个主要问题。(1)echo你忘记在字符串的开头和开头之间留一个空格, (2)正如所指出的,逗号在 bash 中不是有效的说明end of lineBash 使用 asemi-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
Run Code Online (Sandbox Code Playgroud)

输出:

$ 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)
Run Code Online (Sandbox Code Playgroud)

此外,由于 bash 没有typed variables,因此变量应该被视为数字还是字符串可能会产生歧义。类型由上下文决定。declare但是,如果您在第一次使用变量之前使用该变量,则可以让 bash 知道您打算如何使用该变量。例如:

declare -i a="10" b="5" i="1" j="1"
Run Code Online (Sandbox Code Playgroud)

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

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

最后,虽然对数值没有要求,但对double-quote变量来说是个好主意。这将为您省去很多麻烦。