你有两个主要问题。第一个是在字符串的开头和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) 它不包含数字。避免这种情况的方法是始终确保在测试变量之前初始化它们。(您在这里做到了,只是遇到了逗号问题)。
最后,尽管对于数字值并不是必需的,但最好为您的变量加上双引号
。这将在以后许多时候为您节省大量麻烦。
-lt
而不是-ne
。或者用(( ... < ... ))
替换两个[ ... ]
测试。由于((i++))
,该脚本已经不符合POSIX标准。 - Henk Langeveld