Как лучше всего определить, пуста ли переменная в bash ("")?
Я слышал, что рекомендуется делать if [ "x$variable" = "x" ].
Это правильный способ? (должно же быть что-то более простое).
Ответ 1
Это вернет true, если переменная не установлена или установлена в пустую строку ("").
if [ -z "$ { VAR } " ];
Ответ 2
В Bash, когда вы не заботитесь о переносимости для оболочки, которые его не поддерживают, вы всегда должны использовать синтаксис двойных скобок:
Например:
if
if
if
if
При использовании двойных квадратных скобок кавычки не нужны. Тест для переменной, которая содержит значение, можно упростить:
if
Этот синтаксис совместим с ksh (по крайней мере, с ksh93). Он не работает в чистом POSIX или старых оболочках Bourne, таких как sh или dash.
Также можно проверить, не установлена ли конкретная переменная:
if
где «х» произвольное значение.
Если вы хотите узнать, является ли переменная нулевой, и не отключенной:
if
Ответ 3
Переменная в bash (и любой POSIX-совместимой оболочке) может находиться в одном из трех состояний:
-
сброшена
-
установлена в пустую строку
-
установлена в произвольную строку
В большинстве случаев вам нужно только знать, установлена ли переменная в непустую строку, но иногда важно различать неустановленную и установленную на пустую строку.
Ниже приведены примеры того, как можно протестировать различные варианты, это работает в bash или любой POSIX-совместимой оболочке:
if [ -z "$ { VAR } " ]; then
echo "VAR is unset or set to the empty string"
fi
if [ -z "$ { VAR+set } " ]; then
echo "VAR is unset"
fi
if [ -z "$ { VAR-unset } " ]; then
echo "VAR is set to the empty string"
fi
if [ -n "$ { VAR } " ]; then
echo "VAR is set to a non-empty string"
fi
if [ -n "$ { VAR+set } " ]; then
echo "VAR is set, possibly to the empty string"
fi
if [ -n "$ { VAR-unset } " ]; then
echo "VAR is either unset or set to a non-empty string"
fi
Конструкция $ { VAR+foo } раскрывается в пустую строку , если она не задана или в foo, если установлена ( в том числе в пустую строку).
Также $ { VAR-foo } расширяется до значения, если установлена, и в foo, если не задана. Это полезно для предоставления переопределяемых пользователем значений по умолчанию (например, $ { COLOR-red } говорит использовать red, если переменная COLOR не была установлена во что-то).
Причина, по которой [ x"$ { VAR } " = x ] часто рекомендуется проверять, не задана ли переменная или установлена в пустую строку, заключается в том, что некоторые реализации [команды (также известной как test) содержат ошибки. Если VAR установлена во что-то вроде -n, тогда некоторые реализации будут давать неправильные результаты, когда они заданы, [ "$ { VAR } " = "" ] потому что, первый аргумент [ ошибочно интерпретируется как –n оператор, а не строка.
Ответ 4
-z это лучший способ.
Еще один вариант, который я использовал, - это установить переменную и переопределить другой переменной, например
export PORT=$ { MY_PORT:-5432 }
Если $MY_PORT переменная пуста, в PORT устанавливается значение 5432, в противном случае для PORT устанавливается значение MY_PORT. Обратите внимание, что синтаксис включает двоеточие и тире.
Ответ 5
Если вас интересует различие между состояниями set-empty и unset, смотрите на параметр -u для bash:
$ set -u
$ echo $BAR
bash: BAR: unbound variable
$ [ -z "$BAR" ] && echo true
bash: BAR: unbound variable
$ BAR=""
$ echo $BAR
$ [ -z "$BAR" ] && echo true
true
Ответ 6
Альтернатива, которую я видел – это [ -z "$foo" ].Однако я не уверен, почему люди используют этот метод, кто-нибудь знает?
[ "x$ { foo } " = "x" ]
В любом случае, если вы запрещаете неустановленные переменные (с помощью set –u или set -o nounset), у вас возникнут проблемы с обоими этими методами. Для этого есть простое решение:
[ -z "$ { foo:- } " ]
Примечание: это оставит вашу переменную undef.
Ответ 7
В вопросе спрашивается, как проверить, является ли переменная пустой строкой, и для этого уже даны лучшие ответы.
Но я попал сюда после периода программирования на php, и то, что я искал, было проверкой, подобной функции empty в php, работающей в оболочке bash.
После прочтения ответов я понял, что не думал правильно о bash, но в любом случае в тот момент функция типа empty в php была бы так удобна в моем коде bash.
Поскольку я думаю, что такое может случиться и с другими, я решил преобразовать функцию php empty в bash.
Согласно руководству php: переменная считается пустой, если она не существует или если ее значение одно из следующих:
-
"" (пустая строка)
-
0 (0 как целое число)
-
0,0 (0 в виде числа с плавающей запятой)
-
«0» (0 в виде строки)
-
пустой массив
-
объявленна, но без значения
Конечно, случаи null и false не могут быть преобразованы в bash, поэтому они опущены.
function empty {
local var="$1"
# Возвращает true, если:
# 1. Имеет значение null ("" пустая строка)
# 2. Не установлена
# 3. Объявлена, но без значения
# 4. Пустой массив
if test -z "$var"
then
return
# Возвращает true, если 0 (0 для integer или "0" для строки)
elif [ "$var" == 0 2> /dev/null ]
then
return
# Возвращает true, если 0.0 (0 для float)
elif [ "$var" == 0.0 2> /dev/null ]
then
return
fi
}
Пример использования:
if empty "$ { var } "
then
echo "empty"
else
echo "not empty"
fi
Демо - следующий фрагмент:
#!/bin/bash
vars=(
""
0
0.0
"0"
1
"string"
" "
)
for (( i=0; i<$ { #vars[@] } ; i++ ))
do
var="$ { vars[$i] } "
if empty "$ { var } "
then
what="empty"
else
what="not empty"
fi
echo "VAR \"$var\" is $what"
done
exit
Вывод:
VAR "" is empty
VAR "0" is empty
VAR "0.0" is empty
VAR "0" is empty
VAR "1" is not empty
VAR "string" is not empty
VAR " " is not empty
Таким образом, в логике bash проверка на ноль в этой функции может вызвать побочные проблемы. Имхо, любой, кто использует эту функцию, должен оценить этот риск и, возможно, решить убрать эти проверки, или нет.
Ответ 8
Мои 5 центов: есть более короткий синтаксис, чем if ...:
VALUE="$ { 1?"Usage: $0 value" } "
В этой строке будет установлено ЗНАЧЕНИЕ, если был предоставлен аргумент, и будет напечатано сообщение об ошибке с добавлением номера строки сценария (завершится выполнение сценария).
Ответ 9
Предпочитаю более понятный способ проверки:
if [ "$ { VARIABLE } " == "" ]; then
echo VARIABLE is empty
else
echo VARIABLE is not empty
fi
Ответ 10
Не совсем точный ответ, но я столкнулся с этим приемом. Если искомая строка приходит от "команды", то вы можете сохранить команду в переменной env. и затем выполнять ее каждый раз для оператора if, тогда скобки не нужны!
Например, эта команда, которая определяет, находитесь ли вы в debian:
grep debian /proc/version
Полный пример:
IS_DEBIAN="grep -i debian /proc/version"
if $IS_DEBIAN; then
echo 'yes debian'
else
echo 'non debian'
fi
Таким образом, это косвенный способ, который проверяет на пустую строку (проверяет ответ команды на ошибку, и может вернуть пустую строку).