Существует автоволшебный сервис, названный ‘servermgrd’, который слушает на tcp порте 311. Это - демон сервера для ServerAdmin и ServerMonitor, вероятно, других инструментов также. Я только что проверил клиентскую машину, и двоичный файл не существует.
Инцидентным образом порт 626 используется ‘serialnumberd’, чтобы видеть, используют ли другие Серверы OSX тот же порядковый номер в том же широковещательном домене. Инструмент ServerAdmin, вероятно, просто использует servermgrd, хотя он мог бы также использовать serialnumberd в качестве проверки.
Это возвратит true, если переменная будет сброшена или установлена на пустую строку ("").
if [ -z "$VAR" ];
-z
лучший способ.
Другой опции, которые я использовал, состоят в том, чтобы установить переменную, но она может быть переопределена другой переменной, например,
export PORT=${MY_PORT:-5432}
Если $MY_PORT
переменная пуста, затем PORT
установлен на 5 432, иначе ПОРТ установлен на значение MY_PORT
. Обратите внимание, что синтаксис включает двоеточие и тире.
Если Вы интересуетесь различением случаев пустых от набора по сравнению с состоянием сброса, смотрите на-u опцию для удара:
$ set -u
$ echo $BAR
bash: BAR: unbound variable
$ [ -z "$BAR" ] && echo true
bash: BAR: unbound variable
$ BAR=""
$ echo $BAR
$ [ -z "$BAR" ] && echo true
true
все, если затем и-z являются ненужными.
[ "$foo" ] && echo "foo is not empty" [ "$foo" ] || echo "foo is indeed empty"
An alternate I've seen to [ -z "$foo" ]
is the following, however I'm not sure why people use this method, anyone know?
[ "x${foo}" = "x" ]
Anyway if you're disallowing unset variables (either by set -u
or set -o nounset
), then you'll run into trouble with both of those methods. There's a simple fix to this:
[ -z "${foo:-}" ]
Note: this will leave your variable undef.
Лично я предпочитаю более понятный способ проверки:
if [ "${VARIABLE}" == "" ]; then
echo VARIABLE is empty
else
echo VARIABLE is not empty
fi
В Bash, когда вас не волнует переносимость на оболочки, которые его не поддерживают, вы всегда должны использовать синтаксис с двумя скобками:
Любое из следующего:
if [[ -z $variable ]]
if [[ -z "$variable" ]]
if [[ ! $variable ]]
if [[ ! "$variable" ]]
В Bash, используя двойные квадратные скобки, кавычки не требуются. Вы можете упростить тест для переменной, которая действительно содержит значение для:
if [[ $variable ]]
Этот синтаксис совместим с ksh (по крайней мере, ksh93, в любом случае). Он не работает в чистом POSIX или более старых оболочках Bourne, таких как sh или dash.
См. мой ответ здесь и BashFAQ / 031 для получения дополнительной информации о различиях между double и single квадратные скобки.
Вы можете проверить, не установлена ли конкретная переменная (в отличие от пустой строки):
if [[ -z ${variable+x} ]]
где «x» произвольно.
Если вы хотите узнать, является ли переменная нулевой но не сбросить:
if [[ -z $variable && ${variable+x} ]]
Переменная в bash (и любой POSIX-совместимой оболочке) может находиться в одном из трех состояний: Это полезно для предоставления переопределяемых пользователем значений по умолчанию (например, $ {COLOR-red}
говорит использовать red
, если для переменной COLOR
не установлено какое-либо значение) .
Причина, по которой [x "$ {VAR}" = x]
часто рекомендуется для проверки того, не установлена ли переменная или установлена в пустую строку, заключается в том, что некоторые реализации Команда [
(также известная как test
) содержит ошибки. Если для VAR
задано что-то вроде -n
, то некоторые реализации будут делать неправильные вещи, когда задано ["$ {VAR}" = ""]
, потому что первый аргумент [
ошибочно интерпретируется как оператор -n
, а не как строка.
$ {COLOR-red}
говорит использовать красный
, если для переменной COLOR
не установлено какое-либо значение).
Причина, по которой [x "$ {VAR}" = x]
часто рекомендуется для проверки того, не задана ли переменная или имеет ли она пустую строку, потому что некоторые реализации команды [
(также известной как test
) содержат ошибки. Если для VAR
задано что-то вроде -n
, то некоторые реализации будут делать неправильные вещи, когда задано ["$ {VAR}" = ""]
, потому что первый аргумент [
ошибочно интерпретируется как оператор -n
, а не как строка.
$ {COLOR-red}
говорит использовать красный
, если для переменной COLOR
не установлено какое-либо значение).
Причина, по которой [x "$ {VAR}" = x]
часто рекомендуется для проверки того, не задана ли переменная или установлена в пустую строку, потому что некоторые реализации команды [
(также известной как test
) содержат ошибки. Если для VAR
задано что-то вроде -n
, то некоторые реализации будут делать неправильные вещи, когда задано ["$ {VAR}" = ""]
, потому что первый аргумент [
ошибочно интерпретируется как оператор -n
, а не как строка.
[
(также известной как test
) являются глючный. Если для VAR
задано что-то вроде -n
, то некоторые реализации будут делать неправильные вещи, когда задано ["$ {VAR}" = ""]
, потому что первый аргумент [
ошибочно интерпретируется как оператор -n
, а не как строка. = x] часто рекомендуется для проверки того, не установлена ли переменная или установлена в пустую строку, потому что некоторые реализации команды [
(также известной как test
) являются глючный. Если для VAR
задано что-то вроде -n
, то некоторые реализации будут делать неправильные вещи, когда задано ["$ {VAR}" = ""]
, потому что первый аргумент [
ошибочно интерпретируется как оператор -n
, а не как строка. одноразовое расширение решения duffbeer703 :
#! /bin/bash
[ -z "$1" ] || some_command_that_needs_$1_parameter
В вопросе спрашивается , как проверить, является ли переменная пустой строкой , и лучшие ответы на это уже даны.
Но я приземлился здесь после определенного периода, прошедшего через программирование на php, и на самом деле я искал проверку, подобную пустой функции в php , работающей в оболочке bash.
Прочитав ответы, я понял, что неправильно думаю в bash, но в любом случае в тот момент функция вроде empty в php была бы оооочень удобной в моем коде на bash.
Поскольку я думаю, что это может случиться с другими, я решил преобразовать пустую функцию php в bash
Согласно руководству по php :
переменная считается пустой, если она не существует или если его значение - одно из следующих:
Конечно, случаи null и false не могут быть преобразованы в bash, поэтому они опускаются.
function empty
{
local var="$1"
# Return true if:
# 1. var is a null string ("" as empty string)
# 2. a non set variable is passed
# 3. a declared variable or array but without a value is passed
# 4. an empty array is passed
if test -z "$var"
then
[[ $( echo "1" ) ]]
return
# Return true if var is zero (0 as an integer or "0" as a string)
elif [ "$var" == 0 2> /dev/null ]
then
[[ $( echo "1" ) ]]
return
# Return true if var is 0.0 (0 as a 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
output:
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 проверки нуля в этой функции могут вызвать побочные проблемы imho, любой, кто использует эту функцию, должен оценить этот риск и, возможно, решить отключить эти проверки, оставив только первый.
Мои 5 центов: есть также более короткий синтаксис, чем , если ...
, этот:
VALUE="${1?"Usage: $0 value"}"
В этой строке будет установлено ЗНАЧЕНИЕ, если аргумент был предоставлен и напечатает сообщение об ошибке с добавлением номера строки сценария в случае ошибки (и завершит выполнение сценария).
Другой пример можно найти в abs-guide (поиск «Пример 10 -7 »).
Не точный ответ, но столкнулся с этим трюком. Если строка, которую вы ищете, происходит от «команды», вы можете сохранить команду в 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
Это как косвенный способ (каждый раз повторный запуск) для проверки для пустой строки (это проверяет ответ на ошибку от команды, но также бывает, что возвращает пустую строку).
Чтобы выяснить, пуста ли переменная "Foo" и не содержит ли она пробелов (или пробелов, как некоторые ее называют).
if [[ -n "${Foo/[ ]*\n/}" ]];then
echo "Foo is not empty and contains non space characters"
fi
# Another way to solve the same problem: Take spaces out in Foo & check if Foo is empty
if [[ -z "${Foo// }" ]];then
echo "Foo is empty"
fi