在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}?