在shell中创建循环的简单方法
我想打印一个数组作为在shell中创建循环的简单方法,shell,loops,Shell,Loops,我想打印一个数组作为 001 002 003 .. 010 021 022 .. 030 041 042 .. 050 我写了下面的脚本来实现这一点。这是工作得很好,但它是打印一样 001 021 041 002 022 042 #!/bin/sh for i in {1..10}; do while [ $i -le 50 ]; do if [[ $i -le 9 ]];then n=00$i;else n=0$i;fi echo $n i=$(( i + 20 )) done done
001 002 003 .. 010 021 022 .. 030 041 042 .. 050
我写了下面的脚本来实现这一点。这是工作得很好,但它是打印一样
001 021 041 002 022 042
#!/bin/sh
for i in {1..10}; do
while [ $i -le 50 ]; do
if [[ $i -le 9 ]];then n=00$i;else n=0$i;fi
echo $n
i=$(( i + 20 ))
done
done
我正在寻找一个简单的方法,以便它将打印像
001 002 003 .. 010 021 022 .. 030 041 042 .. 050
我假设您使用的是Linux(因为
seq
通常不安装在FreeBSD之类的软件中)
您可以将seq
与-f
选项一起使用
第一个seq
打印001。。010
第二个seq
打印021。。030
最后一个seq
打印041。。050
for i in {0..2}
do seq -f '%03g' $((i*20+1)) $((i*20+10))
done
我假设您使用的是Linux(因为
seq
通常不安装在FreeBSD之类的软件中)
您可以将seq
与-f
选项一起使用
第一个seq
打印001。。010
第二个seq
打印021。。030
最后一个seq
打印041。。050
for i in {0..2}
do seq -f '%03g' $((i*20+1)) $((i*20+10))
done
shell中的
for
-循环需要对静态集进行操作,但您可以在循环中更改$i
相反,使用while
-循环:
i=1
while [ $i -le 50 ]; do
printf "%03d " $i
if [ $( expr $i % 10 ) -eq 0 ]; then
i=$(( i + 11 ))
else
i=$(( i + 1 ))
fi
done
echo
或者,使用bash
或ksh
:
i=1
while (( i <= 50 )); do
printf "%03d " $i
if (( (i % 10) == 0 )); then
(( i += 11 ))
else
(( ++i ))
fi
done
echo
i=1
while((iA)for
-shell中的循环需要在静态集上操作,但是您可以在循环中更改$i
相反,使用while
-循环:
i=1
while [ $i -le 50 ]; do
printf "%03d " $i
if [ $( expr $i % 10 ) -eq 0 ]; then
i=$(( i + 11 ))
else
i=$(( i + 1 ))
fi
done
echo
或者,使用bash
或ksh
:
i=1
while (( i <= 50 )); do
printf "%03d " $i
if (( (i % 10) == 0 )); then
(( i += 11 ))
else
(( ++i ))
fi
done
echo
i=1
而((i使用:
输出(以空格分隔):
001 002 003 004 005 006 007 008 009 010 021 022 023 024 025 026 027
028 029 030 041 042 043 044 045 046 047 048 049 050
对于换行分隔符,添加-N
选项(未显示30行输出):
使用:
输出(以空格分隔):
001 002 003 004 005 006 007 008 009 010 021 022 023 024 025 026 027
028 029 030 041 042 043 044 045 046 047 048 049 050
对于换行分隔符,添加-N
选项(未显示30行输出):
bash:
echo {001..010} {021..030} {041..050}
输出:
001 002 003 004 005 006 007 008 009 010 021 022 023 024 025 026 027 028 029 030 041 042 043 044 045 046 047 048 049 050
bash:
echo {001..010} {021..030} {041..050}
输出:
001 002 003 004 005 006 007 008 009 010 021 022 023 024 025 026 027 028 029 030 041 042 043 044 045 046 047 048 049 050
啊,-f
比我的答案更好,因为缩放可能是个问题。$(…)
的+1算术扩展不是bash
-ism。啊,-f
比我的答案更好,因为缩放可能是个问题。$(…)的+1算术扩展是$(…)
不是一个bash
-ism。与if[[$i-le 9]]相比更优雅;然后n=00$i;否则n=0$i;fi
将是n=$(printf'%03'$i)
只是为了确保数组成员是{1-10,21-30,41-50}?与if[$i-le 9]]相比更优雅;然后n=00$i;否则n=0$i;fi
只是为了确保数组成员是{1-10,21-30,41-50}?