Как лучше всего определить, пуста ли переменная в bash ("")?
Я слышал, что рекомендуется делать if [ "x$variable" = "x" ].
Это правильный способ? (должно же быть что-то более простое).
Ответ 1
Это вернет true, если переменная не установлена или установлена в пустую строку ("").
if [ -z "${VAR}" ];
Ответ 2
В Bash, когда вы не заботитесь о переносимости для оболочки, которые его не поддерживают, вы всегда должны использовать синтаксис двойных скобок:
Например:
if [[ -z $variable ]]
if [[ -z "$variable" ]]
if [[ ! $variable ]]
if [[ ! "$variable" ]]
При использовании двойных квадратных скобок кавычки не нужны. Тест для переменной, которая содержит значение, можно упростить:
if [[ $variable ]]
Этот синтаксис совместим с ksh (по крайней мере, с ksh93). Он не работает в чистом POSIX или старых оболочках Bourne, таких как sh или dash.
Также можно проверить, не установлена ли конкретная переменная:
if [[ -z ${variable+x} ]]
где «х» произвольное значение.
Если вы хотите узнать, является ли переменная нулевой, и не отключенной:
if [[ -z $variable && ${variable+x} ]]
Ответ 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
[[ $( echo "1" ) ]]
return
# Возвращает true, если 0 (0 для integer или "0" для строки)
elif [ "$var" == 0 2> /dev/null ]
then
[[ $( echo "1" ) ]]
return
# Возвращает true, если 0.0 (0 для float)
elif [ "$var" == 0.0 2> /dev/null ]
then
[[ $( echo "1" ) ]]
return
fi
[[ $( echo "" ) ]]
}
Пример использования:
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
Таким образом, это косвенный способ, который проверяет на пустую строку (проверяет ответ команды на ошибку, и может вернуть пустую строку).
Web