在“for”循环条件语句中,evaluate表达式语句$(())的奇怪行为

时间:2014-11-19 20:04:21

标签: bash

有人知道为什么这个循环迭代的次数比它应该少两倍 这是代码:

var1='000000001010111111111010101011111111111110101110'
var2='1010111111111010101011111111111111111111'

if [[ ${#var1} -gt ${#var2} ]] ; then
 for (( vb2=0 ; vb2<$((${#var1} - ${#var2})) ; vb2++ )) ; do
  var2=0"$var2"
 done
fi
echo $var1
echo $var2

我真的很感激任何帮助

2 个答案:

答案 0 :(得分:2)

问题是循环索引和循环结束点随着for循环的每次迭代而改变。

以下代码更简单。它使用单个if循环替换for语句和while语句:

var1='000000001010111111111010101011111111111110101110'
var2='1010111111111010101011111111111111111111'
while ((${#var1} - ${#var2} > 0))
do
  var2=0"$var2"
done
echo $var1
echo $var2

答案 1 :(得分:1)

我认为这是因为这一部分:

vb2<$((${#var1} - ${#var2}))

进行比较时,您将再次重新评估var2的长度。你真正想做的是在循环之前设置一次,例如

...
diff=$(( ${#var1} - ${#var2} ))
for (( vb2=0 ; vb2<$diff ; vb2++ )) ; do
 ...

printf可能是更好的方法。这是一个printf示例:

var1='000000001010111111111010101011111111111110101110'
var2='1010111111111010101011111111111111111111'

if [[ ${#var1} -gt ${#var2} ]] ; then
 diff=$(( ${#var1} - ${#var2} ))
 var2=$( printf "%0${diff}d%s" 0 $var2 )
fi
echo $var1
echo $var2