【问题标题】:Regarding 'for' loop in KornShell关于 KornShell 中的“for”循环
【发布时间】:2011-07-25 15:58:36
【问题描述】:

有没有办法在 KornShell (ksh) 中使用“for”来实现以下功能? 这是 C 的等价物:

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

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

我尝试了以下方法,它似乎不起作用。

for i in [1-20]
    do

    print $i
    done

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

【问题讨论】:

  • 请在网上搜索。 “ksh for”将在瞬间弹出答案。 stackoverflow.com/questions/1591109/…
  • 当然取决于您的互联网连接速度
  • @mat:对不起朋友,我一直在寻找标签错误的东西……我的错!

标签: shell scripting for-loop ksh


【解决方案1】:

不是真正的答案,而是对普通 ksh 用户的 FYI。

编辑 2019-05-12(以下以粗体进行了少量编辑,其他信息现在stricken)。

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

Solaris 和 AIX 具有 ksh 和 ksh93(其他供应商可能也是如此)。基础 ksh 也称为 ksh88。 Ksh93 在The New Kornshell Command and Programming Language, 1995中描述

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

最后,为了进一步混淆事情,不要让 1995 年的发布日期欺骗你,ksh 继续在 正在由 AT&T 的 David Korn 和 Glen Fowler 积极开发直到 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 一样,而其他部分则照常执行。 ...
  • 添加了 [[...]] 运算符 =~,它将字符串与扩展的正则表达式进行比较 ....
  • 内置的 printf(1) 已扩展为支持 = 标志以使字段居中...(和其他)...
  • 视图路径
  • “大多数实用程序由 AT&T 开发,符合 POSIX.2 和 X/Open。​​”

(注意上面的...s,通常表示删除了一些限定信息)

Korn 和 Fowler 已经 还为使用 Mingw 或 Cygwin 等系统的人们开发了一个高级环境 UWIN(Windows 的 Unix),值得单独发表一篇文章。 UWIN 的缺点是,

  • 与您在最喜欢的 Linux 中找到的实用程序集不同。
  • 另一个几乎必须使用 MS Visual C 的文件编译环境(据说通过 Mingw 的 gcc 支持正在进行中),
  • 一个非常小的支持社区,
  • AT&T 通用公共许可证 V 1.0Eclipse 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&T 软件技术 (AST) 工具包 来自 AT&T 研究。截至 2017 年 11 月,开发重点一直是 转移到 ksh(或 ksh93)命令和所需的支持代码 构建它。

AST项目的非ksh代码不再活跃 保持。如果您对非 ksh 代码感兴趣,请参见下文 有关哪些分支包含完整 AST 代码库的详细信息。

该项目仅支持编译器和底层的系统 硬件是 ASCII 兼容的。这包括 IBM zSeries 上的 Linux,但 不是 z/OS。对 EBCDIC 的新生的、不完整的支持已经 删除。请参阅问题 #742。

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

【讨论】:

    【解决方案2】:

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

    for i in $(seq 1 20); do
      echo $i
    done
    

    【讨论】:

    • Solaris 中的 ksh 但是也支持 (( )) 和 {1..20} ......刚刚对它们都进行了测试......感谢您的替代答案
    • 在这里使用 'seq' 看起来有点奇怪。该问题要求'seq'的shell实现。
    • 'seq 1 19' 然后成为这个答案的简写形式 ;-)
    【解决方案3】:

    ksh93 支持 C-like (( ...;...; ...)):

    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
    

    【讨论】:

      【解决方案4】:

      如果“braceexpand”为“on”,ksh93 也提供大括号扩展。使用“set -o”检查,然后使用花括号 {}

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

      【讨论】:

        猜你喜欢
        • 2012-01-07
        • 2019-02-10
        • 2021-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多