我试图在嵌套的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
答案 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具有处理前缀命令的赋值的规则。 对于外部命令,该命令将使用 中自己的环境中指定的变量运行。
对于内部命令,对于当前进程,分配将是永久性的, 因此,在命令完成后,变量及其值将保持不变。