korn shell错误[:缺少“%]”

korn shell错误[:缺少“%]”,shell,sh,ksh,Shell,Sh,Ksh,我正在学习基于Bourne shell的Korn shell。下面是我真正简单的代码 read ab if [ $ab = "a" || $ab = "A" ] ; then echo hi fi 出于某种原因| |操作员给了我一个错误: [: missing `]' a: command not found 编写if条件的正确方法是: read ab if [ "$ab" = "a" ] || [ "$ab" = "A" ]; then echo hi fi 对于[…],必须

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

read ab
if [ $ab = "a" || $ab = "A" ] ; then
    echo hi
fi
出于某种原因| |操作员给了我一个错误:

[: missing `]'
a: command not found

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

read ab
if [ "$ab" = "a" ] || [ "$ab" = "A" ]; then
  echo hi
fi
对于[…],必须将变量放在双引号中。否则,如果变量扩展为零或扩展包含空格,shell将失败并出现语法错误

另见:


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

read ab
if [ "$ab" = "a" ] || [ "$ab" = "A" ]; then
  echo hi
fi
对于[…],必须将变量放在双引号中。否则,如果变量扩展为零或扩展包含空格,shell将失败并出现语法错误

另见:


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

这有两个好处:

您可以在[…]内部使用| | 变量展开不需要引号。 这使得它更安全、更短

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

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

这有两个好处:

您可以在[…]内部使用| | 变量展开不需要引号。 这使得它更安全、更短

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

我正在使用${ab},你还建议使用双引号吗?@Mint.K:是的${ab}如果包含空格,它仍将扩展为两个或更多的单词。@Mint.K,${ab}与$ab没有任何区别,除非您使用的字符串以合法的shell变量名称的一部分开头,即${ab}foo。我使用的是${ab},您仍然建议使用双引号吗?@Mint.K:是的${ab}如果包含空格,它仍将扩展为两个或更多的单词。@Mint.K,${ab}与$ab没有任何区别,除非您使用一个字符串执行串联操作,该字符串以一个作为shell变量名一部分的合法字符开头,即${ab}| foo.The |由shell解释,而不是由[yes]命令解释,[是一个命令。因此,[使用参数$ab=a调用,并抱怨缺少参数]。您可以使用-o,这是的or命令[,但@codeforester中的方法可能是一种更好的方法。@KeithThompson-我逐渐了解到-o在较新版本的Bash中已被弃用。但不确定ksh。@codeforester,实际上是POSIX规范将其标记为过时,而不是任何特定的shell。如果您使用它,这些问题确实会变得不常见e test:如果test$ab=a | | test$ab=a;那么……就不那么容易出错。引号的使用完全是反向的。不需要引用字符串a,但有很好的理由引用$abThe | |是由shell解释的,而不是由[command yes]解释的。因此,[是用参数$ab=a调用的,它抱怨缺少]。您可以使用-o,这是的or命令[,但@codeforester中的方法可能是一种更好的方法。@KeithThompson-我逐渐了解到-o在较新版本的Bash中已被弃用。但不确定ksh。@codeforester,实际上是POSIX规范将其标记为过时,而不是任何特定的shell。如果您使用它,这些问题确实会变得不常见e test:如果test$ab=a | | test$ab=a;,那么…就不那么容易出错。引号的使用完全是反向的。不需要引用字符串a,但有很好的理由引用$ab