Почему 'x' используется в [x "$ VAR" = x "VALUE"]? - PullRequest
3 голосов
/ 22 июня 2010

В сценариях оболочки Unix я вижу, что в следующей конструкции используется

[ x"$VAR" = x"VALUE" ] 

вместо

[ "$VAR" = "VALUE" ] 

Почему?

Ответы [ 4 ]

8 голосов
/ 22 июня 2010

Поскольку оболочки не всегда были в хорошем поведении, если одна из переменных была пустой.

Рассмотрим, если $VAR было пустым / пустым и $VALUE равно "foo", ваши две конструкции расширяются до:

[ x = xfoo ]

и

[ = foo ]

Последний может вызвать ошибку в некоторых оболочках из-за того, что является недопустимой конструкцией, тогда как первая действует в любом случае.Это не проблема в недавней версии bash (возможно, даже в старых версиях bash), но вот откуда она взялась исторически - и, кроме случайного момента недоумения со стороны людей в вашей ситуации, есть небольшая причина не сделать это для совместимости с более широким диапазоном оболочек.

4 голосов
/ 22 июня 2010

, если $ VAR пуст, это приведет к синтаксической ошибке [ = "VALUE"], таким образом, использование x

1 голос
/ 22 июня 2010

Это старая техника, предотвращающая пустоту любой из сторон сравнения. Некоторые оболочки не обрабатывают пустые строки должным образом.

0 голосов
/ 22 июня 2010

у вас есть объяснения, но есть другой подход, использующий case/esac вместо if/else

case "$VAR" in 
  "$VALUE" ) echo 'yes';;
  * ) echo 'no' ;;
esac
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...