我需要循环一些值,

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

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

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

你知道我该怎么做吗?


当前回答

在您的特定情况下,使用-f标志使seq在输出列表时格式化数字可能是最简单的。例如:

for i in $(seq -f "%05g" 10 15)
do
  echo $i
done

将产生以下输出:

00010
00011
00012
00013
00014
00015

更一般地说,bash内置了printf,所以你可以像下面这样用0填充输出:

$ i=99
$ printf "%05d\n" $i
00099

你可以使用-v标志将输出存储在另一个变量中:

$ i=99
$ printf -v j "%05d" $i
$ echo $j
00099

请注意,printf支持与seq略有不同的格式,因此您需要使用%05d而不是%05g。

其他回答

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

#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秒左右运行。

如果你只是想用0填充数字以达到固定长度,只需添加最接近10的倍数 如。对于2位数字,加10^2,然后在显示输出之前删除第一个1。

此解决方案适用于填充/格式化任意长度的单个数字,或使用for循环填充/格式化整个数字序列。

# Padding 0s zeros:
# Pure bash without externals eg. awk, sed, seq, head, tail etc.
# works with echo, no need for printf

pad=100000      ;# 5 digit fixed

for i in {0..99999}; do ((j=pad+i))
    echo ${j#?}
done

在Mac OSX 10.6.8, Bash ver 3.2.48上测试

如果你想要N个数字,加10^N并删除第一个数字。

for (( num=100; num<=105; num++ ))
do
  echo ${num:1:3}
done

输出:

01
02
03
04
05

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

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

在您的特定情况下,使用-f标志使seq在输出列表时格式化数字可能是最简单的。例如:

for i in $(seq -f "%05g" 10 15)
do
  echo $i
done

将产生以下输出:

00010
00011
00012
00013
00014
00015

更一般地说,bash内置了printf,所以你可以像下面这样用0填充输出:

$ i=99
$ printf "%05d\n" $i
00099

你可以使用-v标志将输出存储在另一个变量中:

$ i=99
$ printf -v j "%05d" $i
$ echo $j
00099

请注意,printf支持与seq略有不同的格式,因此您需要使用%05d而不是%05g。