Мне нужно проверить существование переменной в if
заявлении. Что-то с эффектом:
if [ -v $somevar ]
then
echo "Variable somevar exists!"
else
echo "Variable somevar does not exist!"
И самый близкий вопрос к этому был этим , который фактически не отвечает на мой вопрос.
$somevar
на значение / строки , если переменная не существует:${somevar:=42}
.[ -n "$var" ]
или[ ! -z "$var" ]
). Я думаю, что проверки существования / небытия слишком тонки, и я предпочитаю мой код грубый и простой.[ -n "$var" ]
? Связанный: stackoverflow.com/questions/3601515/…Ответы:
В современном bash (версия 4.2 и выше):
От
help test
:источник
[ -v name_of_var ]
.$1
,$-
,$#
...test
или[
; Это не доступно в/usr/bin/test
. Сравнитеman test
сhelp test
.Зависит от того, что вы подразумеваете под существующим .
Есть ли переменная , которая была объявлена , но не приписанные существуют ?
Есть ли массив (или хеш) переменной , которая была назначена пустой список существует ?
Есть ли переменная nameref ссылающийся на переменную , которая в настоящее время не назначается существует ?
Считаете ли вы
$-
,$#
,$1
переменные? (POSIX нет).В борновоподобных оболочках канонический путь таков:
Это работает для скалярных переменных и других параметров , чтобы сказать , если переменная было присвоено значение (пустой или нет, автоматически, из среды, assigments,
read
,for
или другие).Для оболочек, которые имеют команду
typeset
илиdeclare
, они не будут сообщать как установленные переменные, которые были объявлены, но не назначены, кроме как вzsh
.Для оболочек , которые поддерживают массивы, за исключением ,
yash
иzsh
что не будет сообщать , как набор переменного массива , если элемент Indice-не был установлен.Для
bash
(но не ,ksh93
ниzsh
), для переменных типа ассоциативного массива , что бы не сообщать о них , как набор , если их элемент ключ «0» было установлено.Для
ksh93
иbash
для переменных типа nameref это возвращает true, только если переменная, на которую ссылается nameref, сама считается установленной .Для
ksh
,zsh
иbash
, потенциально лучший подход может быть:Для
ksh93
,zsh
иbash
4,4 или выше, есть также:Который будет сообщать о переменных, которые были установлены или объявлены.
источник
declare -p
/typeset -p
работаетbash
сейчас тоже.bash -c 'typeset -i a; typeset -p a'
сравнить сksh93
илиzsh
.Как уже упоминалось в ответе на SO , вот способ проверить:
где $ {somevar + x} - расширение параметра, которое оценивается как ноль, если переменная не установлена, и заменяет строку «x» в противном случае.
Использование
-n
, как предлагает другой ответ, только проверит, содержит ли переменная пустую строку. Это не проверит его существование.источник
$somevar
чтобы справитьсяIFS=x
. Либо это, либо цитатаx
.if [ -z "${somevar+x}" ]
? Будет ли цитирование по-прежнему необходимо внутри[[
и]]
?[ test
процедуры принимают параметры командной строки, так что обычные расширения и интерпретации как заказано обычным способом следует полагаться оказать при вызове теста применяется то , что вы должны вызвать для чтения , таким образом , любой командной строке программы. test {! + "!"}set -u
он действует, и версия Bash до 4.2.POSIXly:
или вы можете позволить вашей оболочке показать сообщение для вас:
источник
trap
может работать только на EXIT. Вот и все, что я говорю - это не очень хорошо подходит как проход / неудача. И я тоже не об этом говорю - я делал именно это раньше, и потребовался небольшой чат с комментариями, чтобы убедить меня. Итак, я просто думал, что заплачу.источник
sh
совместимо, а это как раз то, что мне нужно.... ничего не будет печатать, когда это не так. Или же...
... скажу вам в любом случае.
вы можете использовать возвращаемое значение теста для динамического расширения до соответствующей строки формата для вашего условия:
Вы также можете сделать
printf
сбой на основе замены ...... которая печатает
$var does not exist!
в stderr и возвращает значение, отличное от 0, когда$var
не установлено, но печатает$var does exist!
в stdout и возвращает 0, когда$var
установлено.источник
Эта простая строка работает (и работает на большинстве оболочек POSIX):
Или написано в более длинной форме:
Расширение:
${var+"false"}
Расширения расширяет либо «нулевой» от «ложной».Затем выполняется «ничто» или «ложь», и код выхода устанавливается.
Нет необходимости вызывать команду
test
([
или[[
), поскольку выходное значение задается (выполнением) самого расширения.источник
$IFS
содержит f, a, l, s или e. Как и для других ответов, есть случай массивов, хэшей или других типов переменных, которые можно упомянуть.most POSIX shells
.most
значитIn the greatest number of instances
, не все. ... ... Итак, да, в неясном состоянииwhen $IFS contains f, a, l, s or e
и для какой-то непонятной оболочкиsome old versions of zsh
это терпит неудачу: какой шок !. Я должен предположить, что такая ошибка была решена давно. ... ... Вы предлагаете написать код для давно сломанных оболочек?Чистый способ оболочки:
Тестовый скрипт:
Результаты:
источник
С bash 4.4.19 у меня сработало следующее. Вот полный пример
источник
Вы не можете использовать
if
команду для проверки существования объявленных переменных в bash, однако-v
в более новом bash существует опция, но она не переносима, и вы не можете использовать ее в более старыхbash
версиях. Потому что когда вы используете переменную, если она не существует, она будет рождена одновременно.Например, представьте, что я не использовал и не присваивал значение
MYTEST
переменной, но когда вы используете команду echo, она ничего вам не показывает! Или, если вы используетеif [ -z $MYTEST ]
его, возвращается нулевое значение! Он не возвратил другой статус завершения, который говорит вам, что эта переменная не существует!Теперь у вас есть два решения (без
-v
опции):declare
команду.set
команду.Например:
Но, к сожалению, эти команды также показывают загруженные вами функции в памяти! Вы можете использовать
declare -p | grep -q MYTEST ; echo $?
команду для более чистого результата.источник
Функция для проверки, если переменная объявлена / не установлена
в том числе пустой
$array=()
В дополнение к ответу @ Gilles
- что я не нашел способ для инкапсулировать его в функции - Я хотел бы добавить простой вариант, который частично основан на Richard Hansen «s ответа , но делаю также обратиться к ловушке , что происходит с пустым
array=()
:$1
содержит имя пустого$array=()
, вызов объявления объявит, что мы получим правильный результатС помощью следующего кода функции могут быть протестированы:
Скрипт должен вернуться
источник
Функция bash, которая работает как для скалярных, так и для массивов :
определение
вызов
источник