удар сравнивает ошибку пустых строк

$ [ $(echo) = $(echo) ]
$ echo $?
0
$ [ $(echo) != $(echo) ]
$ echo $?
0

Действительно ли это - ошибка?

P.S. Я заметил это при попытке протестировать, если строка была пуста; кажется, что я могу использовать test -z с этой целью, но все еще любопытно на предмет этого.

0
задан 17 July 2018 в 08:32

2 ответа

Это не ошибка.

Вы не заключили замену команды в кавычки, таким образом, она не была расширена ни во что (вместо того, чтобы остаться пустой строкой). Тесты работали, на самом деле:

[ = ]
[ != ]

С отдельным аргументом, [ ] тесты, не является ли аргументом пустая строка и действительно ни один = ни != пустые строки.

Используйте заключение в кавычки

(если Вам не нужны эффекты неупомянутого расширения, которое Вы, вероятно, не будете),

[ "$(echo)" = "" ] # $? = 0
[ "$(echo)" != "" ] # $? = 1
3
ответ дан 28 October 2019 в 08:10

Когда Вы делаете [ $(echo) != $(echo) ] без заключения в кавычки это эквивалентно [ != ]

Теперь, man bash говорит под SHELL BUILTIN COMMANDS то, что поведение [ ... ] тест зависит от количества аргументов следующим образом:

          0 arguments
                 The expression is false.
          1 argument
                 The expression is true if and only if the argument is not null.

Таким образом, начиная со строки != не является пустым, тест TRUE.

При заключении в кавычки аргументов Вы получите ожидаемое поведение:

$ [ "$(echo)" != "$(echo)" ]
$ echo $?
1
$ [ "$(echo)" = "$(echo)" ]
$ echo $?
0

потому что Вы теперь даете ему 3 аргумента:

  3 arguments
         The following conditions are applied in the order listed.
         If the second argument is one of the  binary  conditional
         operators listed above under CONDITIONAL EXPRESSIONS, the
         result of the expression is the result of the binary test
         using  the first and third arguments as operands.  The -a
         and -o operators are  considered  binary  operators  when
         there  are  three arguments.  If the first argument is !,
         the value is the negation of the two-argument test  using
         the second and third arguments.  If the first argument is
         exactly ( and the third argument is exactly ), the result
         is  the one-argument test of the second argument.  Other‐
         wise, the expression is false.
3
ответ дан 28 October 2019 в 08:10

Другие вопросы по тегам:

Похожие вопросы: