我学习它是基于Bourne shell的Korn shell程序。以下是我非常简单的代码。Korn shell的错误[:缺少']”
read ab
if [ $ab = "a" || $ab = "A" ] ; then
echo hi
fi
出于某种原因||
运营商是给我的错误:
[: missing `]'
a: command not found
我学习它是基于Bourne shell的Korn 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将失败并出现语法错误。
参见:
我正在使用$ {ab},您是否仍然推荐使用双引号? –
@ Mint.K:是的。如果它包含空格,'$ {ab}'仍然会扩展为两个或更多的单词。 –
@ Mint.K,'$ {ab}'与'$ ab'完全相同,除非你用一个以合法字符作为shell变量名的一部分开头的字符串进行串联操作。 '$ {} AB _foo')。 –
如果使用KSH或bash的现代,你可以使用非标准[[
... ]]
而不是[
... ]
。
这有两个好处:
||
内[[
... ]]
这使得安全和更短的写
[[ $ab = a || $ab = A ]]
的''||是由shell解释,而不是由'['命令(是的,'['是一个命令)。所以'['用参数'$ ab =“a”'调用,它抱怨缺少']'。你可以使用'-o',这是'''的'或'命令,但@codeforester中的方法可能是更好的方法。 –
@KeithThompson - 我已经认识到,'-o'已经在最近版本的Bash被弃用。不知道关于ksh。 – codeforester
@codeforester,它实际上是POSIX规范,它标记为过时,而不是任何特定的shell。 –