Bash: как определено присваивание `a=`?

Bash: как определено присваивание `a=`?

В bash, если я делаю назначение

a=

Что aтеперь? Я уверен, что a — это не ''строка, и не 0.

Я нашел только нижеприведенный тест верным

if [ $a = ];then echo 'good';fi

решение1

Это пустая строка.

Это то же самое, что сделать:

a=''

Или

a=""

Или

a=$''

Или, если это имеет значение:

a=''""$''

Эти '', "", и $'...'являются операторами кавычек в оболочке. Когда вы делаете:

a=''

Вы не присваиваете строку, состоящую из двух одинарных кавычек, а $aпустую строку. Они ''излишни, поскольку внутри них ничего нет, но это может сделать ваш код немного более понятным (дать понять, что вы намеревались присвоить пустую строку).

''Чтобы присвоить литерал $a, вам необходимо заключить в кавычки следующие специальные символы:

a="''" a=\'\' a=$'\'\'' a="'"\'

Ваша тестовая команда недействительна. В

[ $a = ]

Поскольку вы забыли заключить в кавычки $a, оператор split+glob применяется к $a. Поскольку $aявляется пустым (но это было бы то же самое, если бы он содержал только пробелы или символы новой строки со значением по умолчанию $IFS), что приводит к отсутствию аргумента, передаваемого команде [.

Итак, все аргументы, [которые получает, — это [, =и ]. Для [это проверка, чтобы определить, =является ли строка непустой, и она возвращает true.

Здесь вам нужно передать следующие аргументы команде [:

  1. [
  2. содержание, $aдля которого вам нужно"$a"
  3. =
  4. пустая строка. Для которой вам нужно ''или ""... Если ничего не передать, это будет означать, что аргумент не передается, [поэтому 4-й аргумент будет закрывающим ].
  5. ]

Итак, должно быть:

if [ "$a" = '' ]; then echo '$a is empty'; fi

Или:

if [ -z "$a" ]; then echo '$a is empty'; fi

решение2

Переменная a равна пустой строке.

a=

if [ "$a" -eq "" ]; then echo 'good'; fi

Выходные данные:

$ . tst.sh  
good

А для этого кода:

a=

if [ -z "$a" ]; then echo 'good'; fi

Результат тот же.

Связанный контент