我需要循环一些值,
for i in $(seq $first $last)
do
does something here
done
对于$first
和$last
,我需要它具有固定长度5.因此,如果输入为1
,我需要在前面添加零,使其变为{{ 1}}。例如,它循环到00001
,但长度必须为5.
例如:99999
,00002
,00042
,00212
等等。
关于我如何做到这一点的任何想法?
答案 0 :(得分:589)
在您的具体情况下,虽然最简单的方法是使用-f
标志seq
来使其在输出列表时格式化数字。例如:
for i in $(seq -f "%05g" 10 15)
do
echo $i
done
将产生以下输出:
00010
00011
00012
00013
00014
00015
更一般地说,bash
有printf
作为内置函数,因此您可以使用零填充输出,如下所示:
$ i=99
$ printf "%05d\n" $i
00099
您可以使用-v
标志将输出存储在另一个变量中:
$ i=99
$ printf -v j "%05d" $i
$ echo $j
00099
请注意,printf
支持的格式与seq
略有不同,因此您需要使用%05d
代替%05g
。
答案 1 :(得分:113)
您可以轻松完成
for i in {00001..99999}; do
echo $i
done
答案 2 :(得分:74)
如果序列的结尾具有最大填充长度(例如,如果你想要5位数并且命令是“seq 1 10000”),那么你可以使用seq的“-w”标志 - 它自己添加填充。 / p>
seq -w 1 10
产生
01
02
03
04
05
06
07
08
09
10
答案 3 :(得分:68)
使用带有“%05d”的printf,例如
printf "%05d" 1
答案 4 :(得分:16)
使用printf
[jaypal:~/Temp] printf "%05d\n" 1
00001
[jaypal:~/Temp] printf "%05d\n" 2
00002
答案 5 :(得分:11)
像这样使用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
通过这种方式,您可以避免在* nix的所有风格上使用不可用的外部程序seq
。
答案 6 :(得分:8)
我输出的数字(零)比我需要的更多,然后使用tail只使用我要查找的位数。请注意,您必须使用&#39; 6&#39;在尾巴中得到最后五位数字:)
for i in $(seq 1 10)
do
RESULT=$(echo 00000$i | tail -c 6)
echo $RESULT
done
答案 7 :(得分:4)
如果您想要N位数,请添加10 ^ N并删除第一位数字。
for (( num=100; num<=105; num++ ))
do
echo ${num:1:3}
done
输出:
01
02
03
04
05
答案 8 :(得分:1)
这也将起作用:
for i in {0..9}{0..9}{0..9}{0..9}
do
echo "$i"
done
答案 9 :(得分: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}
}
答案 10 :(得分:0)
1。)创建一个从1到1000的数字“ seq”序列,并固定宽度“ -w”(宽度由结束数字的长度确定,在这种情况下为1000的4位数字)。
2。)另外,使用'sed -n'选择想要的数字(在这种情况下,我们选择数字1-100)。
3。)“回显”每个数字。数字存储在变量'i'中,可使用'$'访问。
优点:这段代码很干净。
缺点:(据我所知)'seq'不是所有Linux系统都固有的
for i in `seq -w 1 1000 | sed -n '1,100p'`;
do
echo $i;
done
答案 11 :(得分:0)
如果您只是在用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版本3.2.48上测试
答案 12 :(得分:0)
不使用外部进程派生的一种方法是字符串操作,在一般情况下,它看起来像这样:
#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上也很好用,因为分叉是一项非常繁重的操作。我有一个110000个文件列表,使用printf "%06d" $NUM
花费了1分钟,上面的解决方案运行了大约1秒钟。