【问题标题】:korn shell error [: missing `]'korn shell 错误 [: 缺少 `]'
【发布时间】:2017-07-16 18:08:58
【问题描述】:

我正在学习基于 Bourne shell 的 Korn shell。下面是我非常简单的代码。

read ab
if [ $ab = "a" || $ab = "A" ] ; then
    echo hi
fi

由于某种原因,|| 操作员给了我错误:

[: missing `]'
a: command not found

【问题讨论】:

  • || 由 shell 解释,而不是由 [ 命令解释(是的,[ 是一个命令)。所以[ 是用参数$ab = "a" 调用的,它抱怨缺少]。您可以使用-o,这是[ 的“或”命令,但@codeforester 中的方法可能是更好的方法。
  • @KeithThompson - 我了解到-o 在更新的 Bash 版本中已被弃用。虽然不确定 ksh。
  • @codeforester,实际上是 POSIX 规范将其标记为过时,而不是任何特定的外壳。
  • 如果您使用test,这些问题确实会变得不那么常见:if test "$ab" = a || test "$ab" = A; then ... 不太容易出错。
  • 您对引号的使用完全是倒退的。不需要引用字符串a,但有充分的理由引用"$ab"

标签: shell sh ksh


【解决方案1】:

编写if 条件的正确方法是:

read ab
if [ "$ab" = "a" ] || [ "$ab" = "A" ]; then
  echo hi
fi

对于[ ... ],必须将变量放在双引号中。否则,如果变量扩展为空或扩展包含空格,shell 将失败并出现语法错误。


另见:

【讨论】:

  • 我用的是${ab},你还推荐用双引号吗?
  • @Mint.K:是的。 ${ab} 如果包含空格,仍会扩展为两个或更多单词。
  • @Mint.K, ${ab}$ab 完全没有区别,除非您使用以合法字符作为 shell 变量名一部分的字符开头的字符串执行连接操作(即${ab}_foo)。
【解决方案2】:

如果您使用 ksh 或现代 bash,您可以使用非标准的 [[ ... ]] 而不是 [ ... ]

这有两个好处:

  1. 你可以在[[里面使用|| ... ]]
  2. 变量扩展不需要引号。

这样写起来更安全,更短

[[ $ab = a || $ab = A ]]

【讨论】:

    猜你喜欢
    • 2014-11-05
    • 1970-01-01
    • 2014-01-28
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多