在shell中制作循环的简便方法

时间:2016-06-29 07:36:27

标签: 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

4 个答案:

答案 0 :(得分:3)

我假设您使用的是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  

答案 1 :(得分:1)

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

或者bashksh

i=1
while (( i <= 50 )); do
    printf "%03d " $i

    if (( (i % 10) == 0 )); then
        (( i += 11 ))
    else
        (( ++i ))
    fi
done
echo

答案 2 :(得分:1)

使用numrange

numrange /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

对于换行分隔符,添加-N选项(未显示30行输出):

numrange -N /001..010,021..030,041..050/

答案 3 :(得分:1)

<强>的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