if [ -z ${var+x} ]; then echo "var is unset"; else echo "var is set to '$var'"; fi
, где ${var+x}
- расширение параметра , которое ничего не оценивает, если var
не установлено, и заменяет строку x
в противном случае.
Цитаты могут быть опущены (поэтому мы можем сказать ${var+x}
вместо "${var+x}"
), потому что этот синтаксис & amp; использование гарантирует, что это будет расширяться только до чего-то, что не требует кавычек (поскольку оно либо расширяется до x
(которое не содержит разрывов слов, поэтому не нуждается в кавычках), либо до нуля (что приводит к [ -z ]
, который удобно оценивать как то же значение (true), что [ -z "" ]
делает то же самое)).
Однако, хотя кавычки могут быть безопасно опущены, и это было не сразу очевидно для всех (это даже не было очевидно для первого автора этого объяснения цитат , который также является основным Bash-кодером), иногда было бы лучше написать решение с кавычками как [ -z "${var+x}" ]
, при очень небольшой возможной стоимости штрафа за скорость O (1). Первый автор также добавил это в качестве комментария рядом с кодом, использующим это решение, в котором указан URL-адрес этого ответа, который теперь также включает в себя объяснение того, почему кавычки можно безопасно опускать.
if [ -z "$var" ]; then echo "var is blank"; else echo "var is set to '$var'"; fi
Это часто неправильно, потому что не различает переменную, которая не установлена, и переменную, которая установлена в пустую строку. То есть, если var=''
, то вышеупомянутое решение выведет "var is blank".
Различие между unset и «set to the empty string» является существенным в ситуациях, когда пользователь должен указать расширение или дополнительный список свойств, и если не указывать их, по умолчанию используется непустое значение, тогда как указание пустой строки должно заставить скрипт использовать пустое расширение или список дополнительных свойств.
Различие не может быть существенным в каждом сценарии, хотя. В этих случаях [ -z "$var" ]
будет просто отлично.
Ответы выше не работают, если включена опция Bash set -u
. Кроме того, они не являются динамическими, например, как проверить, определяется ли переменная с именем «dummy»? Попробуйте это:
is_var_defined()
{
if [ $# -ne 1 ]
then
echo "Expected exactly one argument: variable name as string, e.g., 'my_var'"
exit 1
fi
# Tricky. Since Bash option 'set -u' may be enabled, we cannot directly test if a variable
# is defined with this construct: [ ! -z "$var" ]. Instead, we must use default value
# substitution with this construct: [ ! -z "${var:-}" ]. Normally, a default value follows the
# operator ':-', but here we leave it blank for empty (null) string. Finally, we need to
# substitute the text from $1 as 'var'. This is not allowed directly in Bash with this
# construct: [ ! -z "${$1:-}" ]. We need to use indirection with eval operator.
# Example: $1="var"
# Expansion for eval operator: "[ ! -z \${$1:-} ]" -> "[ ! -z \${var:-} ]"
# Code execute: [ ! -z ${var:-} ]
eval "[ ! -z \${$1:-} ]"
return $? # Pedantic.
}
Связано: Как в Bash проверить, определена ли переменная в & quot; -u & quot; Режим
В bash вы можете использовать -v
внутри встроенного [[ ]]
:
#! /bin/bash -u
if [[ ! -v SOMEVAR ]]; then
SOMEVAR='hello'
fi
echo $SOMEVAR
Это сработало для меня. Я хотел, чтобы мой скрипт завершал работу с сообщением об ошибке, если параметр не был установлен.
#!/usr/bin/env bash
set -o errexit
# Get the value and empty validation check all in one
VER="${1:?You must pass a version of the format 0.0.0 as the only argument}"
Возвращается с ошибкой при запуске
peek@peek:~$ ./setver.sh
./setver.sh: line 13: 1: You must pass a version of the format 0.0.0 as the only argument
Попробуйте эту опцию, если вы просто хотите проверить, если значение установлено = VALID или не установлено / пусто = INVALID.
TSET="good val"
TEMPTY=""
unset TUNSET
if [ "${TSET:-}" ]; then echo "VALID"; else echo "INVALID";fi
# VALID
if [ "${TEMPTY:-}" ]; then echo "VALID"; else echo "INVALID";fi
# INVALID
if [ "${TUNSET:-}" ]; then echo "VALID"; else echo "INVALID";fi
# INVALID
Или, Даже короткие тесты; -)
[ "${TSET:-}" ] && echo "VALID" || echo "INVALID"
[ "${TEMPTY:-}" ] && echo "VALID" || echo "INVALID"
[ "${TUNSET:-}" ] && echo "VALID" || echo "INVALID"
И это ответ на вопрос. Используйте это, если вы просто хотите проверить, установлено ли значение set / empty = VALID или unset = INVALID.
ПРИМЕЧАНИЕ: «1» в «..- 1}» не имеет значения, это может быть что угодно (например, x)
TSET="good val"
TEMPTY=""
unset TUNSET
if [ "${TSET+1}" ]; then echo "VALID"; else echo "INVALID";fi
# VALID
if [ "${TEMPTY+1}" ]; then echo "VALID"; else echo "INVALID";fi
# VALID
if [ "${TUNSET+1}" ]; then echo "VALID"; else echo "INVALID";fi
# INVALID
Короткие тесты
[ "${TSET+1}" ] && echo "VALID" || echo "INVALID"
[ "${TEMPTY+1}" ] && echo "VALID" || echo "INVALID"
[ "${TUNSET+1}" ] && echo "VALID" || echo "INVALID"
Я посвящаю этот ответ @ mklement0 (комментарии), который заставил меня ответить на вопрос точно.
Ссылка http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02
Чтобы проверить, установлена ли переменная с непустым значением, используйте [ -n "$x" ]
, как уже указали другие.
В большинстве случаев хорошей идеей будет рассматривать переменную с пустым значением так же, как переменную, которая не установлена. Но вы можете различить их, если вам нужно: [ -n "${x+set}" ]
("${x+set}"
расширяется до set
, если установлено x
, и до пустой строки, если x
не установлено).
Чтобы проверить, был ли передан параметр, протестируйте $#
, которое представляет собой число параметров, переданных функции (или сценарию, когда отсутствует в функции) (см. ответ Пола ) .
Я даю сильно сфокусированный на Bash ответ из-за тега bash
.
Пока вы имеете дело только с именованными переменными в Bash, эта функция всегда должна сообщать вам, установлена ли переменная, даже если это пустой массив.
is-variable-set() {
declare -p $1 &>dev/null
}
В Bash (по крайней мере, начиная с 3.0), если var
является объявленной / установленной переменной, то declare -p var
выводит команду declare
, которая бы установите переменную var
равной ее текущему типу и значению и возвращает код состояния 0
(успех). Если var
не объявлено, то declare -p var
выводит сообщение об ошибке в stderr
и возвращает код состояния 1
. Используя &>/dev/null
, перенаправляет как обычный вывод stdout
, так и stderr
на /dev/null
, чтобы его никогда не было видно, и без изменения кода состояния. Таким образом, функция возвращает только код состояния.
[ -n "$var" ]
: Эта проверка только, если${var[0]}
не пусто. (В Bash$var
совпадает с${var[0]}
.)[ -n "${var+x}" ]
: Это только проверяет, установлено ли${var[0]}
.[ "${#var[@]}" != 0 ]
: Проверяется только, установлен ли хотя бы один индекс$var
.
Это работает только для именованных переменных (включая Я даю сильно сфокусированный на Bash ответ из-за тега [114]. Пока вы имеете дело только с именованными переменными в Bash, эта функция всегда должна сообщать вам, установлена ли переменная, даже если это пустой массив. В Bash (по крайней мере, начиная с 3.0), если [115] является объявленной / установленной переменной, то [116] выводит команду [117], которая бы установите переменную [118] равной ее текущему типу и значению и возвращает код состояния [119] (успех). Если [1110] не объявлено, то [1111] выводит сообщение об ошибке в [1112] и возвращает код состояния [1113]. Используя [1114], перенаправляет как обычный вывод [1115], так и [1116] на [1117], чтобы его никогда не было видно, и без изменения кода состояния. Таким образом, функция возвращает только код состояния. Это работает только для именованных переменных (включая [1126]), а не определенных специальных переменных ( Если в вашем скрипте есть массивы, и вы пытаетесь сделать его совместимым с максимально возможным количеством оболочек, рассмотрите возможность использования Если вам нужен ваш сценарий для совместимости с POSIX sh, вы не можете использовать массивы. Без массивов Эта функция сбрасывает переменную Я пропускаю Обратите внимание, что результаты теста могут быть неожиданными из-за того, что Bash рассматривает индексы нечислового массива как «0», если переменная не была объявлена как ассоциативный массив. Кроме того, ассоциативные массивы действительны только в Bash 4.0 +. Тестовая мнемоника в строке заголовка соответствует
), а не определенных специальных переменных ( Заметка
Короткий ответ
Почему это работает
Почему другие методы (иногда) терпят неудачу в Bash
Когда этот метод не работает в Bash
$!
, $@
, $#
, $
, $*
, $?
, $-
, [1134]
, $1
, $2
, ... и все, что я мог забыть). Поскольку ни один из них не является массивом, стиль POSIX [ -n "${var+x}" ]
работает для всех этих специальных переменных. Но остерегайтесь оборачивать его в функцию, так как многие специальные переменные меняют значения / существование при вызове функций. Замечание по совместимости оболочки
typeset -p
вместо declare -p
. Я читал, что ksh поддерживает только первое, но не смог проверить это. Я знаю, что Bash 3.0+ и Zsh 5.5.1 поддерживают оба typeset -p
и declare -p
, отличающиеся только тем, что одно является альтернативой другому. Но я не проверял различия между этими двумя ключевыми словами и не проверял другие оболочки. [ -n "{$var+x}" ]
работает. Код сравнения для различных методов в Bash
var
, eval
переданный код, запускает тесты, чтобы определить, установлено ли var
кодом eval
d, и, наконец, показывает результирующие коды состояния для различных тестов. test -v var
, [ -v var ]
и [[ -v var ]]
, потому что они дают результаты, идентичные стандарту POSIX [ -n "${var+x}" ]
, при этом требуется Bash 4.2+. Я также пропускаю typeset -p
, потому что он совпадает с declare -p
в оболочках, которые я тестировал (Bash 3.0 через 5.0 и Zsh 5.5.1). is-var-set-after() {
# Set var by passed expression.
unset var
eval "$1"
# Run the tests, in increasing order of accuracy.
[ -n "$var" ] # (index 0 of) var is nonempty
nonempty=$?
[ -n "${var+x}" ] # (index 0 of) var is set, maybe empty
plus=$?
[ "${#var[@]}" != 0 ] # var has at least one index set, maybe empty
count=$?
declare -p var &>/dev/null # var has been declared (any type)
declared=$?
# Show test results.
printf '%30s: %2s %2s %2s %2s\n' "$1" $nonempty $plus $count $declared
}
Код тестового примера
# Header.
printf '%30s: %2s %2s %2s %2s\n' "test" '-n' '+x' '#@' '-p'
# First 5 tests: Equivalent to setting 'var=foo' because index 0 of an
# indexed array is also the nonindexed value, and non-numerical
# indices in an array not declared as associative are the same as
# index 0.
is-var-set-after "var=foo" # 0 0 0 0
is-var-set-after "var=(foo)" # 0 0 0 0
is-var-set-after "var=([0]=foo)" # 0 0 0 0
is-var-set-after "var=([x]=foo)" # 0 0 0 0
is-var-set-after "var=([y]=bar [x]=foo)" # 0 0 0 0
# '[ -n "$var" ]' fails when var is empty.
is-var-set-after "var=''" # 1 0 0 0
is-var-set-after "var=([0]='')" # 1 0 0 0
# Indices other than 0 are not detected by '[ -n "$var" ]' or by
# '[ -n "${var+x}" ]'.
is-var-set-after "var=([1]='')" # 1 1 0 0
is-var-set-after "var=([1]=foo)" # 1 1 0 0
is-var-set-after "declare -A var; var=([x]=foo)" # 1 1 0 0
# Empty arrays are only detected by 'declare -p'.
is-var-set-after "var=()" # 1 1 1 0
is-var-set-after "declare -a var" # 1 1 1 0
is-var-set-after "declare -A var" # 1 1 1 0
# If 'var' is unset, then it even fails the 'declare -p var' test.
is-var-set-after "unset var" # 1 1 1 1
Тестовый вывод
[ -n "$var" ]
, [ -n "${var+x}" ]
, [ "${#var[@]}" != 0 ]
и declare -p var
, соответственно. test: -n +x #@ -p
var=foo: 0 0 0 0
var=(foo): 0 0 0 0
var=([0]=foo): 0 0 0 0
var=([x]=foo): 0 0 0 0
var=([y]=bar [x]=foo): 0 0 0 0
var='': 1 0 0 0
var=([0]=''): 1 0 0 0
var=([1]=''): 1 1 0 0
var=([1]=foo): 1 1 0 0
declare -A var; var=([x]=foo): 1 1 0 0
var=(): 1 1 1 0
declare -a var: 1 1 1 0
declare -A var: 1 1 1 0
unset var: 1 1 1 1
Резюме
declare -p var &>/dev/null
надежно (100%?) Для тестирования именованных переменных в Bash, начиная с версии 3.0. [ -n "${var+x}" ]
надежен в ситуациях, соответствующих POSIX, но не может обрабатывать массивы. $!
, $@
, $#
, $
, $*
, $?
, $-
, [1134]
, $1
, $2
, ... и все, что я мог забыть). Поскольку ни один из них не является массивом, стиль POSIX [ -n "${var+x}" ]
работает для всех этих специальных переменных. Но остерегайтесь оборачивать его в функцию, так как многие специальные переменные меняют значения / существование при вызове функций.
Если в вашем скрипте есть массивы, и вы пытаетесь сделать его совместимым с максимально возможным количеством оболочек, рассмотрите возможность использования typeset -p
вместо declare -p
. Я читал, что ksh поддерживает только первое, но не смог проверить это. Я знаю, что Bash 3.0+ и Zsh 5.5.1 поддерживают оба typeset -p
и declare -p
, отличающиеся только тем, что одно является альтернативой другому. Но я не проверял различия между этими двумя ключевыми словами и не проверял другие оболочки.
Если вам нужен ваш сценарий для совместимости с POSIX sh, вы не можете использовать массивы. Без массивов [ -n "{$var+x}" ]
работает.
Эта функция сбрасывает переменную var
, eval
переданный код, запускает тесты, чтобы определить, установлено ли var
кодом eval
d, и, наконец, показывает результирующие коды состояния для различных тестов.
Я пропускаю test -v var
, [ -v var ]
и [[ -v var ]]
, потому что они дают результаты, идентичные стандарту POSIX [ -n "${var+x}" ]
, при этом требуется Bash 4.2+. Я также пропускаю typeset -p
, потому что он совпадает с declare -p
в оболочках, которые я тестировал (Bash 3.0 через 5.0 и Zsh 5.5.1).
Обратите внимание, что результаты теста могут быть неожиданными из-за того, что Bash рассматривает индексы нечислового массива как «0», если переменная не была объявлена как ассоциативный массив. Кроме того, ассоциативные массивы действительны только в Bash 4.0 +.
[112] Тестовая мнемоника в строке заголовка соответствует [ -n "$var" ]
, [ -n "${var+x}" ]
, [ "${#var[@]}" != 0 ]
и declare -p var
, соответственно.
declare -p var &>/dev/null
надежно (100%?) Для тестирования именованных переменных в Bash, начиная с версии 3.0.[ -n "${var+x}" ]
надежен в ситуациях, соответствующих POSIX, но не может обрабатывать массивы.- Существуют другие тесты для проверки, является ли переменная непустой, и для проверки объявленных переменных в других оболочках. Но эти тесты не подходят ни для скриптов Bash, ни для POSIX.
Использование [[ -z "$var" ]]
- это самый простой способ узнать, была ли переменная установлена или нет, но эта опция -z
не различает неустановленную переменную и переменную, установленную в пустую строку:
$ set=''
$ [[ -z "$set" ]] && echo "Set" || echo "Unset"
Unset
$ [[ -z "$unset" ]] && echo "Set" || echo "Unset"
Unset
Лучше проверить это в соответствии с типом переменной: переменная env, параметр или обычная переменная.
Для переменной env:
[[ $(env | grep "varname=" | wc -l) -eq 1 ]] && echo "Set" || echo "Unset"
Для параметра (например, для проверки существования параметра $5
):
[[ $# -ge 5 ]] && echo "Set" || echo "Unset"
Для регулярной переменной (используя вспомогательную функцию, чтобы сделать это элегантным образом):
function declare_var {
declare -p "$1" &> /dev/null
}
declare_var "var_name" && echo "Set" || echo "Unset"
Примечания:
$#
: дает вам количество позиционных параметров.declare -p
: дает определение переменной, переданной в качестве параметра. Если он существует, возвращает 0, если нет, возвращает 1 и печатает сообщение об ошибке.&> /dev/null
: подавляет вывод изdeclare -p
, не влияя на его код возврата.
Я всегда нахожу таблицу POSIX в другом ответе медленно, чтобы грокать, поэтому вот мое взятие на это:
+----------------------+------------+-----------------------+-----------------------+
| if VARIABLE is: | set | empty | unset |
+----------------------+------------+-----------------------+-----------------------+
- | ${VARIABLE-default} | $VARIABLE | "" | "default" |
= | ${VARIABLE=default} | $VARIABLE | "" | $(VARIABLE="default") |
? | ${VARIABLE?default} | $VARIABLE | "" | exit 127 |
+ | ${VARIABLE+default} | "default" | "default" | "" |
+----------------------+------------+-----------------------+-----------------------+
:- | ${VARIABLE:-default} | $VARIABLE | "default" | "default" |
:= | ${VARIABLE:=default} | $VARIABLE | $(VARIABLE="default") | $(VARIABLE="default") |
:? | ${VARIABLE:?default} | $VARIABLE | exit 127 | exit 127 |
:+ | ${VARIABLE:+default} | "default" | "" | "" |
+----------------------+------------+-----------------------+-----------------------+
Обратите внимание, что каждая группа (с и без предшествующего двоеточия) имеет одинаковые набор и неустановленных случаев, поэтому единственное, что отличается, - это то, как обрабатываются пустые случаи.
С предыдущим двоеточием случаи пустых и unset идентичны, поэтому я бы использовал те, где это возможно (т. Е. Используйте :=
, а не только =
, потому что пустой случай не согласуется).
Заголовки:
VARIABLE
не пусто (VARIABLE="something"
) VARIABLE
пуст / ноль (VARIABLE=""
) VARIABLE
не существует (unset VARIABLE
) Значения:
$VARIABLE
означает, что результатом является исходное значение переменной. "default"
означает, что результатом была предоставленная замещающая строка. ""
означает, что результат равен нулю (пустая строка). exit 127
означает, что скрипт прекращает выполнение с кодом завершения 127. $(VARIABLE="default")
означает, что результатом является исходное значение переменной , а предоставленная строка замены присваивается переменной для будущего использования. Чтобы увидеть, является ли переменная непустой, я использую
if [[ $var ]]; then ... # `$var' expands to a nonempty string
Противоположные тесты, если переменная либо не установлена, либо пуста:
if [[ ! $var ]]; then ... # `$var' expands to the empty string (set or not)
Чтобы узнать, установлена ли переменная (пустой или непустой), я использую
if [[ ${var+x} ]]; then ... # `var' exists (empty or nonempty)
if [[ ${1+x} ]]; then ... # Parameter 1 exists (empty or nonempty)
Противоположные тесты, если переменная не установлена:
if [[ ! ${var+x} ]]; then ... # `var' is not set at all
if [[ ! ${1+x} ]]; then ... # We were called with no arguments
Есть много способов сделать это, одним из них является следующее:
if [ -z "$1" ]
Это успешно, если $ 1 ноль или не установлен
[[ ]]
только ловушка мобильности. if [ -n "$1" ]
должен использоваться здесь.
– Jens
10.07.2013, 06:55
foo=""
, $foo
имеет значение, но -z
просто сообщит об этом it' s пустой. И -z $foo
аварийно завершится, если Вы будете иметь set -o nounset
.
– Keith Thompson
06.08.2013, 09:13
-u
установлен, это приведет к ошибке.
– Daniel C. Sobral
12.09.2013, 04:22
Хотя большинство методов, изложенных здесь, верны, bash 4.2 поддерживает фактический тест на наличие переменной ( man bash ), а не тестирует значение переменной ,
[[ -v foo ]]; echo $?
# 1
foo=bar
[[ -v foo ]]; echo $?
# 0
foo=""
[[ -v foo ]]; echo $?
# 0
Примечательно, что этот подход не приведет к ошибке при использовании для проверки неустановленной переменной в режиме set -u
/ set -o nounset
, в отличие от многих других подходов, таких как использование [ -z
.
[[ -v aaa ]]; echo $?
==> -bash: conditional binary operator expected
-bash: syntax error near 'aaa'
– Dan
31.10.2013, 22:52
Чтобы проверить ненулевую / ненулевую строковую переменную, т.е. если она установлена, используйте
if [ -n "$1" ]
Это противоположно -z
. Я использую -n
больше, чем -z
.
Вы бы использовали это как:
if [ -n "$1" ]; then
echo "You supplied the first parameter!"
else
echo "First parameter not supplied."
fi
[[ ]]
[более чем 111], поскольку [[ ]]
более мощно и вызывает меньше проблем в определенных ситуациях (см. этот вопрос для объяснения различия между двумя). Вопрос конкретно просит удар решение и doesn' t упоминают любые требования мобильности.
– Flow
14.10.2013, 05:26
[]
работы лучше специально для оболочки (неудар) сценарии.
– Hengjie
03.06.2014, 03:09
Я всегда использую это, основываясь на том факте, что его легко понять любому, кто видит код в первый раз:
if [ "$variable" = "" ]
then
echo "Variable X is empty"
fi
И, если хочет проверить, не пуст ли он ;
if [ ! "$variable" = "" ]
then
echo "Variable X is not empty"
fi
Вот и все.
[[ ... ]]
вместо [ ... ]
. Последний является на самом деле внешней командой и wouldn' t имеют любую видимость в то, установлена ли переменная или нет.
– solidsnack
30.11.2013, 11:41
[[ $foo ]]
Или
(( ${#foo} ))
Или
let ${#foo}
Или
declare -p foo
Мне нравятся вспомогательные функции, чтобы скрыть грубые детали bash. В этом случае это добавляет еще больше (скрытой) грубости:
# The first ! negates the result (can't use -n to achieve this)
# the second ! expands the content of varname (can't do ${$varname})
function IsDeclared_Tricky
{
local varname="$1"
! [ -z ${!varname+x} ]
}
Поскольку у меня впервые были ошибки в этой реализации (вдохновленные ответами Дженса и Лайонела), я придумал другое решение:
# Ask for the properties of the variable - fails if not declared
function IsDeclared()
{
declare -p $1 &>/dev/null
}
Я нахожу это более прямым, более застенчивым и более легким для понимания / запоминания. Тестовый пример показывает, что он эквивалентен:
function main()
{
declare -i xyz
local foo
local bar=
local baz=''
IsDeclared_Tricky xyz; echo "IsDeclared_Tricky xyz: $?"
IsDeclared_Tricky foo; echo "IsDeclared_Tricky foo: $?"
IsDeclared_Tricky bar; echo "IsDeclared_Tricky bar: $?"
IsDeclared_Tricky baz; echo "IsDeclared_Tricky baz: $?"
IsDeclared xyz; echo "IsDeclared xyz: $?"
IsDeclared foo; echo "IsDeclared foo: $?"
IsDeclared bar; echo "IsDeclared bar: $?"
IsDeclared baz; echo "IsDeclared baz: $?"
}
main
Тестовый пример также показывает, что local var
НЕ НЕ объявляет var (если не следует '='). В течение достаточно долгого времени я думал, что я объявил переменные таким образом, просто чтобы теперь обнаружить, что я просто выразил свое намерение ... Я полагаю, это неоперация.
IsDeclared_Tricky xyz: 1
IsDeclared_Tricky foo: 1
IsDeclared_Tricky bar: 0
IsDeclared_Tricky baz: 0
IsDeclared xyz 1
IsDeclared boo: 1
IsDeclared bar: 0
IsDeclared baz: 0
БОНУС: usecase
Я в основном использую этот тест, чтобы задавать (и возвращать) параметры для функций несколько «элегантным» и безопасным способом (почти напоминающим интерфейс ...):
#auxiliary functions
function die()
{
echo "Error: $1"; exit 1
}
function assertVariableDeclared()
{
IsDeclared "$1" || die "variable not declared: $1"
}
function expectVariables()
{
while (( $# > 0 )); do
assertVariableDeclared $1; shift
done
}
# actual example
function exampleFunction()
{
expectVariables inputStr outputStr
outputStr="$inputStr world!"
}
function bonus()
{
local inputStr='Hello'
local outputStr= # remove this to trigger error
exampleFunction
echo $outputStr
}
bonus
При вызове со всеми требуются объявленные переменные:
Hello world!
else:
Ошибка: переменная не объявлена: outputStr
if [[ ${1:+isset} ]]
then echo "It was set and not null." >&2
else echo "It was not set or it was null." >&2
fi
if [[ ${1+isset} ]]
then echo "It was set but might be null." >&2
else echo "It was was not set." >&2
fi
Если вы хотите проверить, связана ли переменная или нет, это хорошо работает, даже после того, как вы включили опцию nounset:
set -o noun set
if printenv variableName >/dev/null; then
# variable is bound to a value
else
# variable is unbound
fi
set -o nounset
, не set -o noun set
. Это только работает на переменные, которые были export
редактор, это также изменяет Ваши настройки способом that' s неудобный отменить.
– Keith Thompson
06.08.2013, 09:10
$1
будет установлен на пустую строку.
– HelloGoodbye
28.11.2013, 09:58
${var+x}
корректная замена для использования. Используя[ -z ${var:+x} ]
не приводит ни к какому различному результату, чем[ -z "$var" ]
. – Graeme 14.02.2014, 11:08