遍历 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_VERSIONecho $.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 上,您可能需要致电 ksh93ksh 是基于较旧的、有限的 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 中的一系列整数?的主要内容,如果未能解决你的问题,请参考以下文章

C语言基础:enum 枚举类型(定义遍历枚举元素枚举在 switch 中的使用将整数转换为枚举)

对具有 O(1) 复杂度的一系列索引中的值求和 [关闭]

因子个数 --- 递归法 / 遍历法

7.整数反转Java版,每日一题系列(此题来自力扣网)

7.整数反转Java版,每日一题系列(此题来自力扣网)

剑指Offer对答如流系列 - 二叉搜索树的后序遍历序列