我需要循环一些值,

for i in $(seq $first $last)
do
    does something here
done

对于$first和$last,我需要它的固定长度为5。所以如果输入是1,我需要在前面加上0,这样它就变成了00001。例如,它循环到99999,但长度必须是5。

例如:00002,00042,00212,12312等等。

你知道我该怎么做吗?


当前回答

其他方式:

zeroos="000"
echo 

for num in {99..105};do
 echo ${zeroos:${#num}:${#zeroos}}${num}
done

转换任何数字的简单函数是:

function leading_zero(){

    local num=$1
    local zeroos=00000
    echo ${zeroos:${#num}:${#zeroos}}${num} 

}

其他回答

使用printf非常简单

[jaypal:~/Temp] printf "%05d\n" 1
00001
[jaypal:~/Temp] printf "%05d\n" 2
00002

我用比我需要的更多的数字(零)来填充输出,然后使用tail来只使用我正在寻找的数字数量。注意,你必须在tail中使用'6'来获得最后5位数字:)

for i in $(seq 1 10)
do
RESULT=$(echo 00000$i | tail -c 6)
echo $RESULT
done

像这样使用awk:

awk -v start=1 -v end=10 'BEGIN{for (i=start; i<=end; i++) printf("%05d\n", i)}'

输出:

00001
00002
00003
00004
00005
00006
00007
00008
00009
00010

更新:

作为纯bash的替代方案,你可以这样做来获得相同的输出:

for i in {1..10}
do
   printf "%05d\n" $i
done

通过这种方式,您可以避免使用外部程序seq,该程序在所有*nix版本中都不可用。

一种不使用外部进程分叉的方法是字符串操作,在一般情况下,它看起来像这样:

#start value
CNT=1

for [whatever iterative loop, seq, cat, find...];do
   # number of 0s is at least the amount of decimals needed, simple concatenation
   TEMP="000000$CNT"
   # for example 6 digits zero padded, get the last 6 character of the string
   echo ${TEMP:(-6)}
   # increment, if the for loop doesn't provide the number directly
   TEMP=$(( TEMP + 1 ))
done

这在WSL上也能很好地工作,在WSL中,分叉是一个非常繁重的操作。我有一个110000个文件列表,使用printf“%06d”$NUM花了1分钟多,上面的解决方案在1秒左右运行。

其他方式:

zeroos="000"
echo 

for num in {99..105};do
 echo ${zeroos:${#num}:${#zeroos}}${num}
done

转换任何数字的简单函数是:

function leading_zero(){

    local num=$1
    local zeroos=00000
    echo ${zeroos:${#num}:${#zeroos}}${num} 

}