关于KornShell中的'for'循环

时间:2011-03-29 21:57:30

标签: shell scripting for-loop ksh

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

for(i=1;i<20;i++)
{
    printf("%d",i);
}

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

我尝试了以下操作,似乎无法正常工作。

for i in [1-20]
    do

    print $i
    done

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

4 个答案:

答案 0 :(得分:6)

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

编辑2019-05-12 粗体中的小编辑,其他信息现在 stricken )。

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

Solaris和AIX有一个ksh和ksh93(对其他供应商来说也是如此)。基础ksh也称为ksh88。 Ksh93在The New Kornshell Command and Programming Language, 1995

中有描述

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

最后,为了进一步混淆事情,不要让1995年的发布日期欺骗你,ksh 继续 正在积极开发中由David Korn和Glen Fowler在AT&amp;直到2012年? 版本每年发布2-3次。一些Linux版本会选择较新的版本。

这些较新版本具有非常高级的功能 (大部分取自 AT&T research UWIN page. search for the link 'notes and changes' (死链接))

  • 复合变量组成类似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以使字段居中......(和其他人)......
  • view-pathing
  • “大多数实用程序都是由AT&amp; T开发的,符合POSIX.2和X / Open。​​”

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

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

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

参见 UWin main page (死链接):不幸的是,过时了,最好在上面的dnld链接中找到它。嗯,这更好 Glenn Fowler's FAQ for UWin (也死了,Time Machine有人吗?)。

我希望这有帮助!

修改2019-05-12 。死链接的原因是什么? David Korn and Glen Fowler Laid Off (at AT&T, 2012?

后来有消息称他们正在Google工作。我无法证实这一点,所以认为这是一个古老的谣言。

并查看Is Ksh93 dead?

ast git-hub site似乎还有一些活动。 ast是包含ksh93的重叠包。您可以在那里获得新的源代码并进行编译。


以下是项目说明的文字。 (README.md)中有相当多的信息。

  

ksh93的

     

此存储库包含AT&amp; T软件技术(AST)工具包   来自AT&amp; T Research。截至2017年11月,发展重点一直是   转移到ksh(或ksh93)命令和支持所需的代码   建立它。

     

AST项目的非ksh代码不再是主动的   保持。如果您对非ksh代码感兴趣,请参阅下面的内容   有关哪些分支包含完整AST代码库的详细信息。

     

该项目仅支持编译器和底层系统   硬件与ASCII兼容。这包括Linux on IBM zSeries但是   不是z / OS。对EBCDIC的新生,不完整的支持一直是   除去。见问题#742。

* EPL取代了AT&amp; T的原始CPL。

答案 1 :(得分:5)

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

seq

答案 2 :(得分:5)

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

for ((i=1;i<20;i+=1)); do
    printf "%d " $i
done && print

这将产生:

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

在较旧的shell中,您仍可以使用

获得相同的效果
i=1 && while ((i<20)); do
    printf "%d " $i
    ((i+=1))
done && print

答案 3 :(得分:1)

如果“braceexpand”“on”,

ksh93也会提供大括号扩展。选中“set -o”,然后使用花括号{}

for i in {1..20}
do
  print $i
done