В 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.
Здесь вам нужно передать следующие аргументы команде [
:
[
- содержание,
$a
для которого вам нужно"$a"
=
- пустая строка. Для которой вам нужно
''
или""
... Если ничего не передать, это будет означать, что аргумент не передается,[
поэтому 4-й аргумент будет закрывающим]
. ]
Итак, должно быть:
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
Результат тот же.