在ksh中如何迭代一个整数范围?

32

我该如何在ksh中使用for循环遍历一个简单的整数范围?

比如,我的脚本目前是这样的...

for i in 1 2 3 4 5 6 7
do
   #stuff
done

...但我希望将范围扩展到7以外,有更好的语法吗?

7个回答

47

花括号?

for i in {1..7}
do
   #stuff
done

1
请参见https://dev59.com/HXVC5IYBdhLWcg3w1E7w。 - martin clayton
14
花括号 {1..7} 在 ksh 中无法使用。它们可以在 Linux 中使用,因为 Linux 的 ksh 是指向 bash shell 的符号链接。此外,在适当的 korn shell 中也无法使用类 C 的语法。 - Perkolator
2
Linux的哪个版本将ksh链接到bash? - Dennis Williamson
在AIX上,您可能需要调用ksh93ksh基于较旧、有限的ksh88。同样适用于Solaris,包括Solaris 10。 - Henk Langeveld
3
谢谢。即使是像 {01..219} 这样的表达式(在zsh中)也可以工作,即被解析为 "01 02 ... 09 10 11 .. 99 100 101 102 ... 219"。 - Albert

15

While循环?

while [[ $i -lt 1000 ]] ; do
    # stuff
   (( i += 1 ))
done

谢谢 - 那样可以,但没有其他的for循环语法吗? - razlebe
2
在我尝试的所有版本中,只有这个版本可行。我正在使用ksh的UNIX系统。182 while [[ $i -lt 1000 ]] ; do i=$(($i+1)) echo "asdf $i" done 183 history - mathtick
4
如果需要符合 POSIX 标准,请将 ((i+=1)) 替换为 i=$((i+1)) - ezequiel-garzon
在定义 i=0 之后,这个程序可以正常运行。我正在运行 AIX 6.1.0.0,没有 seq 命令,但在我的新安装的 7.1.0.0 版本上可以使用。 - Wally
这是一个很好的解决方案,适用于AIX ksh用户,因为在AIX中其他{1..1000}无法使用。 - Davy M

11

ksh93、Bash 和 zsh 都可以理解类 C 语言的 for 循环语法:

for ((i=1; i<=9; i++))
do
    echo $i
done

很遗憾,虽然 ksh 和 zsh 可以使用花括号范围语法来处理常量和变量,但是 Bash 仅能处理常量(包括 Bash 4)。


1
不适用于AIX。这在所有版本的KSH上都不正确。 - Katerberg
sbtorsvr391:~/temp/pipes $ ksh $ for ((i=1; i<=9; i++)) ksh: 语法错误: `((' 意外的 - mathtick
ksh93?我不知道。由于Solaris安装维护不良,所以可能没有。如何检查?ksh --version没有任何反应。 - mathtick
@mathtick:尝试使用echo $KSH_VERSION或者echo ${.sh.version} - Dennis Williamson
那也不行...$ echo ${.sh.version} ksh: ${.sh.version}: 错误的替换 $ echo $KSH_VERSION$ - mathtick
显示剩余3条评论

11

在OpenBSD上,请使用jot命令:

for i in `jot 10`; do echo $i ; done;

哦,我的天啊,这就是它!:D - Jon Marnock

6
使用seq
for i in $(seq 1 10)
do 
  echo $i
done

1
@C.Ross 看起来有人在你的 AIX 机器上安装了“seq”。它不是标准安装的(至少我使用的 6.1 版本没有)。 - gbtimmon

5
以下内容适用于AIX / Linux / Solaris ksh。
#!/bin/ksh

d=100

while (( $d < 200 ))
do
   echo "hdisk$d"
  (( d=$d+1 ))
done

如果你想在数字前面补零,让数字变成五位数,比如 00100 .. 00199,你可以这样开始:

#!/bin/ksh
typeset -Z5 d

-Scott
-斯科特

2

由于AIX没有范围操作符或seq,以下是我在IT技术中使用的一些滥用perl的示例。

这里是一个for循环,使用类似seq的perl语法:

for X in `perl -e 'print join(" ", 1..10)'` ; do something $X ; done

这很相似,但我更喜欢使用while read循环而不是for循环。没有反引号或空格问题。
perl -le 'print "$_ " for 1..10;' | while read X ; do xargs -tn1 ls $X ; done

我最喜欢的是使用类似bash的shell通配符,这种情况下可以使用perl进行排列组合。

perl -le 'print for glob "e{n,nt,t}{0,1,2,3,4,5}"' | xargs -n1 rmdev -dl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接