Відповіді:
Це повернеться true, якщо змінна не встановлена або встановлена у порожній рядок ("").
if [ -z "$VAR" ];
if [ ! -z "$VAR" ];
-z
є-n
if [ -n "$VAR" ];
$var
в командному рядку буде розділений пробілом на список параметрів, при "$var"
цьому завжди буде лише один параметр. Цитування змінних часто є хорошою практикою і не дозволяє вам запускати назви файлів, що містять пробіли (серед іншого). Приклад: після цього a="x --help"
спробуйте cat $a
- це надасть вам сторінку допомоги cat
. Тоді спробуйте cat "$a"
- це (як правило) скаже cat: x --help: No such file or directory
. Словом, цитуйте рано і цитуйте часто, і ви майже ніколи не пошкодуєте про це.
У Bash, коли ви не переймаєтеся переносимістю оболонок, які не підтримують його, завжди слід використовувати синтаксис з подвійним дужкою:
Будь-яке з наступного:
if [[ -z $variable ]]
if [[ -z "$variable" ]]
if [[ ! $variable ]]
if [[ ! "$variable" ]]
У Bash, використовуючи подвійні квадратні дужки, лапки не потрібні. Ви можете спростити тест змінної, яка містить значення:
if [[ $variable ]]
Цей синтаксис сумісний з ksh (принаймні, ksh93, у будь-якому випадку). Він не працює в чистих POSIX або старих оболонках Борна, таких як sh або dash.
Дивіться мою відповідь тут і BashFAQ / 031 для отримання додаткової інформації про відмінності між подвійними та одинарними квадратними дужками.
Ви можете перевірити, чи змінена конкретна змінна (на відміну від порожнього рядка):
if [[ -z ${variable+x} ]]
де "х" довільне.
Якщо ви хочете дізнатися, чи є змінна нульовою, але не скасована:
if [[ -z $variable && ${variable+x} ]]
if [[ $variable ]]
добре працювало для мене і навіть не потребувало того, set -u
що вимагало одне з інших запропонованих рішень.
sh
замість Bash. Якщо вам потрібні розширені можливості, які він надає, використовуйте Bash і використовуйте його повністю.
;
кінці немає ніяких вимог . На then
наступному рядку може бути зовсім без крапки з комою.
Змінна в bash (і будь-якій сумісній з POSIX оболонці) може бути в одному з трьох станів:
Більшу частину часу вам потрібно лише знати, чи змінна встановлена на не порожню рядок, але періодично важливо розрізняти unset та set до порожнього рядка.
Нижче наведено приклади того, як ви можете перевірити різні можливості, і він працює в 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 is: | unset | empty | non-empty |
+-----------------------+-------+-------+-----------+
| [ -z "${VAR}" ] | true | true | false |
| [ -z "${VAR+set}" ] | true | false | false |
| [ -z "${VAR-unset}" ] | false | true | false |
| [ -n "${VAR}" ] | false | false | true |
| [ -n "${VAR+set}" ] | false | true | true |
| [ -n "${VAR-unset}" ] | true | false | true |
+-----------------------+-------+-------+-----------+
${VAR+foo}
Конструкція розкривається в порожній рядок , якщо VAR
вона НЕ задана , або foo
якщо VAR
встановлено що - то ( в тому числі порожній рядок).
${VAR-foo}
Конструкція розширюється до значення , VAR
якщо встановлено ( в тому числі встановити в порожній рядок) і foo
якщо НЕ задано. Це корисно для надання налаштованих за замовчуванням користувачів (наприклад, ${COLOR-red}
використовує, red
якщо змінна COLOR
не була встановлена на щось).
Причина, чому [ x"${VAR}" = x ]
часто рекомендується перевірити, чи змінна або встановлена в порожній рядок, полягає в тому, що деякі реалізації [
команди (також відомі як test
) є помилковими. Якщо VAR
встановлено щось на кшталт -n
, то деякі імплементації зроблять неправильну дію при наданні, [ "${VAR}" = "" ]
оскільки перший аргумент до [
помилково трактується як -n
оператор, а не рядок.
[ -z "${VAR-set}" ]
.
set -u
або set -o nounset
в bash, тест просто призведе до помилки "bash: VAR: unbound змінної". Дивіться stackoverflow.com/a/13864829 для більш надійної перевірки на скасування. Моя перевірка перевіряє, чи є змінною нульовою чи не встановленою [ -z "${VAR:-}" ]
. Моя перевірка наявності змінної не порожня [ "${VAR:-}" ]
.
-z
- найкращий спосіб.
Іншим варіантом, який я використав, є встановлення змінної, але її можна замінити іншою змінною, наприклад
export PORT=${MY_PORT:-5432}
Якщо $MY_PORT
змінна порожня, PORT
встановлюється 5432, інакше PORT встановлюється значенням MY_PORT
. Зверніть увагу, що синтаксис включає двокрапку і тире.
set -o nounset
в деяких сценаріях.
Альтернатива, яку я бачив, [ -z "$foo" ]
полягає в наступному, однак я не впевнений, чому люди використовують цей метод, хтось знає?
[ "x${foo}" = "x" ]
У будь-якому випадку, якщо ви забороняєте невстановлені змінні (або через, set -u
або set -o nounset
), у вас виникнуть проблеми з обома цими методами. Існує просте виправлення цього:
[ -z "${foo:-}" ]
Примітка. Це змінить вашу змінну undef.
-z
сайті pubs.opengroup.org/onlinepubs/009695399/utilities/test.html . В основному, це не означає, що це альтернатива -z
. Скоріше, він обробляє випадки, коли $foo
може розширюватися до чогось, починаючи з метахарактера, який би [
або test
плутав. Поставлення довільного неметахара на початку виключає таку можливість.
Питання запитує , як перевірити , чи є змінна порожній рядок і кращі відповіді вже дані для цього.
Але я приземлився сюди після періоду, який пройшов програмування в php, і те, що я насправді шукав, було перевірки, як порожня функція в php, що працює в оболонці bash.
Прочитавши відповіді, я зрозумів, що не думаю належним чином в баші, але все одно в цей момент така функція, як порожня в php, була б так зручна в моєму баш-коді.
Оскільки я думаю, що це може трапитися з іншими, я вирішив перетворити порожню функцію php в bash.
Відповідно до посібника з php :
змінна вважається порожньою, якщо її немає або якщо її значення є одним із наступних:
Звичайно, нульові та помилкові випадки не можуть бути перетворені в 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
Виходи:
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
Сказавши, що в логіці баша перевірка нуля в цій функції може викликати побічні проблеми, будь-хто, хто використовує цю функцію, повинен оцінити цей ризик і, можливо, вирішить скоротити ці чеки, залишивши лише перший.
empty
- чому ви писали [[ $( echo "1" ) ]] ; return
замість просто return 1
?
цілі if-тоді і -z непотрібні.
["$ foo"] && echo "foo не порожній" ["$ foo"] || відлуння "foo дійсно порожній"
Це справедливо саме тоді, коли $ FOO встановлено та порожнє:
[ "${FOO+x}" = x ] && [ -z "$FOO" ]
Особисто віддаю перевагу більш зрозумілому способу перевірки:
if [ "${VARIABLE}" == "" ]; then
echo VARIABLE is empty
else
echo VARIABLE is not empty
fi
розширення oneliner duffbeer703 :
#! /bin/bash
[ -z "$1" ] || some_command_that_needs_$1_parameter
Мої 5 центів: також є коротший синтаксис, ніж if ...
цей:
VALUE="${1?"Usage: $0 value"}"
Цей рядок встановить VALUE, якщо аргумент наданий, і буде надруковано повідомлення про помилку, попередньо вказане з номером рядка сценарію, у разі помилки (і завершить виконання сценарію).
Інший приклад можна знайти в путівнику abs (пошук «Приклад 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
Отже, це як непрямий спосіб (щоразу повторюючи його) для перевірки порожнього рядка (трапляється, що перевірка на відповідь про помилку з команди, але також буває повернення порожнього рядка).