2017-02-26 67 views
1

我学习它是基于Bourne shell的Korn shell程序。以下是我非常简单的代码。Korn shell的错误[:缺少']”

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

出于某种原因||运营商是给我的错误:

[: missing `]' 
a: command not found 
+2

的''||是由shell解释,而不是由'['命令(是的,'['是一个命令)。所以'['用参数'$ ab =“a”'调用,它抱怨缺少']'。你可以使用'-o',这是'''的'或'命令,但@codeforester中的方法可能是更好的方法。 –

+0

@KeithThompson - 我已经认识到,'-o'已经在最近版本的Bash被弃用。不知道关于ksh。 – codeforester

+2

@codeforester,它实际上是POSIX规范,它标记为过时,而不是任何特定的shell。 –

回答

3

正确的方式来写你的if条件是:

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

随着[ ... ],有必要把双引号中的变量。否则,如果变量展开为空或者它们的扩展包含空格,则shell将失败并出现语法错误。


参见:

+0

我正在使用$ {ab},您是否仍然推荐使用双引号? –

+1

@ Mint.K:是的。如果它包含空格,'$ {ab}'仍然会扩展为两个或更多的单词。 –

+0

@ Mint.K,'$ {ab}'与'$ ab'完全相同,除非你用一个以合法字符作为shell变量名的一部分开头的字符串进行串联操作。 '$ {} AB _foo')。 –

1

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

这有两个好处:

  1. 您可以使用||[[ ... ]]
  2. 可变扩展不需要引号。

这使得安全和更短的写

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