【问题标题】:Arrays for ksh and bashksh 和 bash 的数组
【发布时间】:2013-07-08 13:42:41
【问题描述】:

我正在编写一个在 bash 和 ksh 中都可以工作的脚本。我有以下代码

if [ -e /bin/ksh ]; then
       set -A arrayexample a b c
else
       arrayexample=('a' 'b' 'c')
fi

我在 ksh 中运行时出现以下错误消息:

Syntax error at line 4:(' 不是预期的`

【问题讨论】:

  • 你运行的是什么版本的 bash?
  • arrayexample=('a' 'b' 'c') 应该在kshbash 中都有效。您看到的错误似乎不是来自 shell,而是来自不支持数组的 shell。
  • @dougEfresh 版本 4.2.20
  • 这应该适用于该版本。从标签中,您是否在 hp-ux 中运行它?你是如何调用这个脚本的?另外,我认为您想使用 $SHELL 或 $KSH_VERSION 或 $BASH_VERSION 变量来确定您正在运行的 shell。-e /bin/ksh 仅表示文件存在并且可执行,但并不意味着您正在运行 /bin/ ksh
  • 我过去读过关于 ksh 和 HP-UX 的问题。 echo ${.sh.version} 是否返回一些东西,或者只是一个错误消息?如果错误消息且没有版本信息,那么您使用的是 ksh88,您必须搜索以查找服务器上是否安装了 ksh93+。祝你好运。

标签: shell hp-ux


【解决方案1】:

正如其他人所指出的,最好通过测试环境变量来测试当前 shell 是否为 ksh。可执行文件的位置太容易更改。然后,尽管您的 else 子句可能不需要在 ksh 上执行,但它确实需要解析。 PD KSH v5.2.14 在解析 else 子句时会抱怨“ksh: syntax error: `(' unexpected”,而 MIRBSD KSH R43 可以无错误地解析和执行该语法。

这是一个在 ksh 和 bash 的任一版本中都可以使用的函数,它使用 eval 来规避解析问题:

# example invocation:
# A B [C D ...]
# sets B[0]=C, B[1]=D, ...
A()if [ "$KSH_VERSION" ]
   then set -A $1 "${@:2}"
   else eval $1='("${@:2}")'
   fi

【讨论】:

    【解决方案2】:

    尝试执行脚本

    bash script.sh
    

    ksh script.sh
    

    我怀疑你的脚本是由默认 shell 执行的,在 HP-UX 中它是(我相信)POSIX shell,它不支持数组。

    【讨论】:

    • 错误发生在 korn shell 上,而它不应该首先读取 else 中的代码。
    • if 只检查/bin/ksh 是否存在,而不是当前处理脚本的shell。你确定你使用ksh运行吗?
    • 是的,当我尝试使用 ksh script.sh 运行脚本时,我遇到了同样的错误。当我在满足条件 -e /bin/ksh 的 HP-UX 中运行它时会发生错误
    • 您使用的是哪个版本的kshwhich ksh 是否输出 /bin/ksh
    • 哪个ksh输出/bin/ksh,但是不知道ksh的版本
    猜你喜欢
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2014-06-26
    • 2013-10-21
    • 1970-01-01
    • 2020-04-21
    • 2011-05-22
    相关资源
    最近更新 更多