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