关于KornShell中的'for'循环

tom*_*h13 2 shell scripting ksh for-loop

有没有办法在KornShell(ksh)中使用'for'来实现以下内容?这是C等价物:

for(i=1;i<20;i++)
{
    printf("%d",i);
}
Run Code Online (Sandbox Code Playgroud)

我想知道这是否可以使用'for'而不是'while'来实现

我试过以下,似乎没有用.

for i in [1-20]
    do

    print $i
    done
Run Code Online (Sandbox Code Playgroud)

请让我知道您的想法和解决方案.

she*_*ter 6

不是一个真正的答案,而是对于休闲ksh用户的一个FYI.

为了澄清这里的几条评论,在典型的供应商安装中有2个ksh(非Linux(也许它们也是?)).

Solaris和AIX有一个ksh和ksh93(对其他供应商来说也是如此).基础ksh也称为ksh88.Ksh93The New Kornshell Command and Programming Language,1995中有所描述

具有真正ksh(而不是pdksh)的Linux系统大多使用名为ksh的ksh93.

最后,为了进一步混淆事情,不要让1995年的发布日期欺骗你,ksh继续由AT&T的David Korn和Glen Fowler积极开发.新版本每年发布2-3X.一些Linux版本会选择较新的版本.

这些较新的版本具有非常先进的功能(大部分功能来自AT&T研究UWIN页面.搜索链接'注释和更改')

  • 复合变量组成像c结构(没有c数据类型,只是排版decls)(一个用户声称500 Meg内存结构)
  • 具有完整C99算法的双精度浮点运算.数字Inf和NaN可用于算术表达式.
  • TAB-TAB完成生成完整的编号列表...
  • 支持处理/处理多字节语言环境(例如,en_US.UTF-8,hi_IN.UTF-8,ja_JP.eucJP,zh_CN.GB18030,zh_TW.BIG5等)...
  • / dev /(tcp | udp | sctp)/ host/sevrice现在处理IPv6地址......
  • ...通过偏移或内容与新的重定向运算符搜索文件.
  • 一个新的--showme选项,允许脚本的某些部分表现得像-x一样,而其他部分像往常一样执行....
  • 添加了[[...]] operator =〜,将字符串与扩展正则表达式进行比较....
  • printf(1)内置已经扩展到支持= flag用于居中一个字段...(和其他)...
  • 视图路径功能
  • "大多数实用程序都是由AT&T开发的,符合POSIX.2和X/Open.​​"

(注意......上面的...... s,通常表示删除了一些符合条件的信息)

Korn和Fowler还为使用Mingw或Cygwin等系统的人们制作了一个先进的环境UWIN(Unix for Windows),这个系统值得单独发布.UWIN的缺点是,

  • 与您在自己喜欢的Linux中找到的实用程序集不同.
  • 另一个文件编译环境几乎必须使用MS Visual C(通过Mingw的gcc支持据说是在路上),
  • 一个非常小的支持社区,
  • AT&T的Common Public License V 1.0 的Eclipse公共许可*是不是GNU.

查看UWin主页:不幸的是过时了,最好在上面的dnld链接中查看.嗯,这对于Glenn Fowler的UWin常见问题解答要好得多.我希望这有帮助!

*EPL取代了AT&T的原始CPL.


Sie*_*geX 5

不幸的是,它看起来ksh似乎不支持基于范围的大括号扩展或支持(( ))构造,所以要紧凑地执行此操作,您需要seq像这样调用外部二进制文件:

for i in $(seq 1 20); do
  echo $i
done
Run Code Online (Sandbox Code Playgroud)


Hen*_*eld 5

ksh93支持类似C的代码(( ...;...; ...))

for ((i=1;i<20;i+=1)); do
    printf "%d " $i
done && print
Run Code Online (Sandbox Code Playgroud)

这将产生:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

哎呀,即使是旧的语法(使用'{'...'}'而不是'do ... done'也可以):

for((i=1;i<20;i+=1))
{
   printf "%d " $i
} && print
Run Code Online (Sandbox Code Playgroud)

在较旧的Shell中,您仍然可以通过

i=1 && while ((i<20)); do
    printf "%d " $i
    ((i+=1))
done && print
Run Code Online (Sandbox Code Playgroud)