2

考虑一下,下面的代码按预期工作:

if [[ $SOME_VARIABLE = "TRUE" ]]; then
   echo "Only echoed when \$SOME_VARIABLE stores string \"TRUE\"."
fi

但是当我删除相等运算符周围的空间时,它总是评估为 0 退出状态(至少这是我认为它必须返回的,因为它被认为是真的):

if [[ $SOME_VARIABLE="TRUE" ]]; then
   echo "Always true."
fi

更新:

只是为了确认问题是否出在相等运算符上:

#!usr/bin/ksh

SOME_VARIABLE=FALSE

if [[ $SOME_VARIABLE == "TRUE" ]]; then
   echo "Only echoed when \$SOME_VARIABLE stores string \"TRUE\"."
fi


if [[ $SOME_VARIABLE=="TRUE" ]]; then
   echo "Always true."
fi


[kent@TEST]$ sh test.sh
Always true.

更新:

概括:

  1. 使用与上面=相同==,但已过时。
  2. 始终注意您的空间。
4

3 回答 3

4

来自ksh(1)

条件表达式。

   A conditional expression is used with the [[ compound command  to  test
   attributes  of  files and to compare strings.  Field splitting and file
   name generation are not performed on the words between [[ and ]].  Each
   expression  can  be constructed from one or more of the following unary
   or binary expressions:

   **string** True, if string is not null.

   ...

所以下面的表达式为真:

[[ somestring ]]

现在考虑你的第二个例子:

if [[ $SOME_VARIABLE="TRUE" ]]; then

假设$SOME_VARIABLE是“SOMETHINGNOTTRUE”,这将扩展为:

if [[ SOMETHINGNOTTRUE=TRUE ]]; then

“SOMETHINGNOTTRUE=TRUE”是一个非零长度字符串。因此这是真的。

如果要在 中使用运算符[[,则必须按照文档中的说明在它们周围放置空格(注意空格):

   string == pattern
          True, if string matches pattern.  Any part  of  pattern  can  be
          quoted to cause it to be matched as a string.  With a successful
          match to a pattern, the .sh.match array  variable  will  contain
          the match and sub-pattern matches.
   string = pattern
          Same as == above, but is obsolete.
于 2012-12-19T15:15:41.783 回答
2

因为如果字符串不是空字符串,则测试的一种参数形式为真。由于唯一以=TRUE它结尾的参数肯定不是空字符串,因此测试评估为真。

太空,最后的边界:-)

始终注意您的空间并牢记分词。

于 2012-12-19T15:18:56.043 回答
0

只是为了堆积,这在 ksh 手册页中明确指出(在test命令的描述中):

请注意,如果testor的参数数量[ ... ]少于五个,则应用一些特殊规则(由 POSIX 提供):如果!可以剥离前导参数以仅保留一个参数,则执行字符串长度测试(同样,即使参数是一元运算符)

(强调我的)

于 2012-12-19T19:59:56.540 回答