如何将变量放入for循环中?

如何将变量放入for循环中?
for seq in {046725..046899}
do
   #body
done

上面的代码段运行得很好,保留前面的零序列变量,但为什么下面的代码段不运行?有什么办法吗?我需要 序列如果存在任何前置零,则 for 循环中的变量具有前置零。

lowest=046725
highest=046899
for seq in {$lowest..$highest}
do
  #body
done

答案1

“大括号扩展在任何其他扩展之前执行” - 来自 bash 手册。之后是变量扩展。

答案2

您应该能够使用以下代码来完成此操作:

#!/bin/bash

lowest=046725
highest=046899
width=6

for (( seq=10#$lowest; seq<=10#$highest; seq++))
  do

    length=`echo -n $seq | wc -c`

    if [[ $length < $width ]]; then

      number_of_zeroes_to_add=`expr $width - $length`

      for zeroes in `seq $number_of_zeroes_to_add`;
        do echo -n 0;
      done

    fi

    echo $seq


done

其作用是确定数字的宽度(例如 6 个字符宽),识别不符合此宽度的数字(因为前导零已被截断),然后重新插入它们。

答案3

大括号扩展{...}远远领先于参数扩展${..}

重新处理该行并获取 $var 内的值以执行大括号扩展的一种方法是使用eval(不推荐,在这种情况下也不是真正需要):

lowest=046725
highest=046899
for for seq in $(eval echo {$lowest..$highest});
do
    #body
done

如果限制的数字没有前导零,那就更好了,但如果有,这也会将它们转换。

根据要求,输出将有一个前导零。并且是由单体控制的printf。如果需要两个零,请更改06为。07

#!/bin/bash

lowest=046725              highest=046899

seq="$(( 10#$lowest ))"    max="$(( 10#$highest ))"

while    (( seq <= max ))
do       printf '%06d\n' $(( seq++ ))
done

如果您需要变量中的结果,请使用此行(并使用 var):

do       printf -v var '%06d\n' $(( seq++ ))

还有一个sh版本:

#!/bin/sh

lowest=00046725    highest=000046899

seq=${lowest#"${lowest%%[!0]*}"}
max=${highest#"${highest%%[!0]*}"}

while    [ $seq -le $max ]
do       printf '%06d ' "$seq"
         seq=$(( seq + 1 ))
done

相关内容