遍历 ksh 中的一系列整数?
Posted
技术标签:
【中文标题】遍历 ksh 中的一系列整数?【英文标题】:Iterating through a range of ints in ksh? 【发布时间】:2010-12-08 03:31:04 【问题描述】:如何在 ksh 中使用 for 循环遍历一个简单的整数范围?
例如,我的脚本目前正在执行此操作...
for i in 1 2 3 4 5 6 7
do
#stuff
done
...但我想将范围扩展到 7 以上。有更好的语法吗?
【问题讨论】:
【参考方案1】:使用seq
:
for i in $(seq 1 10)
do
echo $i
done
【讨论】:
@C.Ross 看起来有人在您的 AIX 机器上安装了“seq”。它不是标准的(至少在我使用的 6.1 盒子上不是)【参考方案2】:以下将适用于 AIX / Linux / Solaris ksh。
#!/bin/ksh
d=100
while (( $d < 200 ))
do
echo "hdisk$d"
(( d=$d+1 ))
done
如果您想填充到 5 个位置,即 00100 .. 00199,您可以从以下开始:
#!/bin/ksh
typeset -Z5 d
-斯科特
【讨论】:
【参考方案3】:我只在 AIX 中使用了几个示例,因为没有范围运算符或序列,而是滥用 perl。
这是一个 for 循环,使用 perl like seq:
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 globbing,在这种情况下使用 perl 排列。
perl -le 'print for glob "en,nt,t0,1,2,3,4,5"' | xargs -n1 rmdev -dl
【讨论】:
【参考方案4】:ksh93、Bash 和 zsh 都懂 C-like for
循环语法:
for ((i=1; i<=9; i++))
do
echo $i
done
不幸的是,虽然 ksh 和 zsh 理解带有常量和变量的花括号范围语法,但 Bash 只处理常量(包括 Bash 4)。
【讨论】:
不适用于 AIX。这在所有版本的 KSH 上都不正确 sbtorsvr391:~/temp/pipes $ ksh $ for ((i=1; i @mathtick:您使用的是 ksh93(如我的回答中所述)吗? ksh93?我不知道。在维护不善的 Solaris 上安装,所以可能不会。如何检查? ksh --version 什么都不做。 @mathtick:试试echo $KSH_VERSION
或echo $.sh.version
【参考方案5】:
在 OpenBSD 上,使用 jot:
for i in `jot 10`; do echo $i ; done;
【讨论】:
天哪,就是这样! :D【参考方案6】:大括号?
for i in 1..7
do
#stuff
done
【讨论】:
另见***.com/questions/169511/… 大括号 1..7 在 ksh 中不起作用。他们在 Linux 中这样做,因为 linux 的 ksh 是 bash shell 的符号链接。类似 c 的 sintax 也不能在适当的 korn shell 中工作。 哪个版本的 Linux 将 ksh 符号链接到 bash? 在 AIX 上,您可能需要致电ksh93
; ksh
是基于较旧的、有限的 ksh88
。 Solaris 10 及以下版本相同。
谢谢。甚至像 01..219
这样的工作(在 zsh 中),即评估为“01 02 ... 09 10 11 .. 99 100 101 102 ... 219”。【参考方案7】:
While循环?
while [[ $i -lt 1000 ]] ; do
# stuff
(( i += 1 ))
done
【讨论】:
谢谢 - 这很好,但没有其他 for 循环语法吗? 在我尝试的所有版本中,只有这一个有效。我在 UNIX 上使用 ksh。 182 而 [[ $i -lt 1000 ]] ; do i=$(($i+1)) echo "asdf $i" done 183 history 如果需要符合 POSIX 标准,请将((i+=1))
替换为 i=$((i+1))
。
这在您定义i=0
后效果很好。我在没有 seq
的情况下运行 AIX 6.1.0.0,它在我的 7.1.0.0
新安装上运行。
这对于 AIX ksh 用户来说是一个很好的解决方案,因为其他 1..1000
在 AIX 中不起作用以上是关于遍历 ksh 中的一系列整数?的主要内容,如果未能解决你的问题,请参考以下文章