Как проверить, установлена ​​ли переменная в Bash? - PullRequest
1308 голосов
/ 30 августа 2010

Как узнать, установлена ​​ли переменная в Bash?

Например, как я могу проверить, передал ли пользователь первый параметр функции?

function a {
    # if $1 is set ?
}

Ответы [ 32 ]

0 голосов
/ 13 июня 2019

После просмотра всех ответов это также работает:

if [[ -z $SOME_VAR ]]; then read -p "Enter a value for SOME_VAR: " SOME_VAR; fi
echo "SOME_VAR=$SOME_VAR"

если вы не поставите SOME_VAR вместо того, что у меня есть $SOME_VAR, он установит для него пустое значение; $ необходимо, чтобы это работало.

0 голосов
/ 30 августа 2010
case "$1" in
 "") echo "blank";;
 *) echo "set"
esac
0 голосов
/ 21 ноября 2012

Чтобы проверить, установлена ​​ли переменная

var=""; [[ $var ]] && echo "set" || echo "not set"
0 голосов
/ 26 мая 2013

Если вы хотите проверить, связана ли переменная или нет, это хорошо работает, даже после того, как вы включили опцию nounset:

set -o noun set

if printenv variableName >/dev/null; then
    # variable is bound to a value
else
    # variable is unbound
fi
0 голосов
/ 12 марта 2016

Функции для проверки, объявлена ​​ли переменная / не установлена ​​

включая пустые $array=()


Следующие функции проверяют, существует ли указанное имя как переменная

# The first parameter needs to be the name of the variable to be checked.
# (See example below)

var_is_declared() {
    { [[ -n ${!1+anything} ]] || declare -p $1 &>/dev/null;}
}

var_is_unset() {
    { [[ -z ${!1+anything} ]] && ! declare -p $1 &>/dev/null;} 
}
  • Сначала проверив, установлена ​​ли (не) переменная, можно ли избежать вызова объявления, если в этом нет необходимости.
  • Если, однако, $1 содержит имя пустого $array=(), вызов объявления объявит, что мы получим правильный результат
  • В / dev / null никогда не передается много данных, так как метод объявления вызывается только в том случае, если переменная не установлена ​​или пустой массив.

Эта функция будет тестироваться, как показано в следующих условиях:

a;       # is not declared
a=;      # is declared
a="foo"; # is declared
a=();    # is declared
a=("");  # is declared
unset a; # is not declared

a;       # is unset
a=;      # is not unset
a="foo"; # is not unset
a=();    # is not unset
a=("");  # is not unset
unset a; # is unset

.

Подробнее

и тестовый скрипт см. Мой ответ на вопрос «Как проверить, существует ли переменная в bash?» .

Примечание: Подобное использование declare -p, как это также показывает Peregring-lk ' answer , действительно случайно. Иначе я бы, конечно, зачислил это!

0 голосов
/ 01 марта 2016

Мне нравятся вспомогательные функции, чтобы скрыть грубые детали 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 foo: 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

Если вызывается со всеми объявленными переменными:

Привет, мир!

еще:

Ошибка: переменная не объявлена: outputStr

0 голосов
/ 30 июня 2013
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
0 голосов
/ 07 сентября 2013

Я всегда использую это, основываясь на том факте, что его легко понять любому, кто видит код впервые:

if [ "$variable" = "" ]
    then
    echo "Variable X is empty"
fi

И, если хотите проверить, не пусто ли;

if [ ! "$variable" = "" ]
    then
    echo "Variable X is not empty"
fi

Вот и все.

0 голосов
/ 11 февраля 2015
if [[ ${!xx[@]} ]] ; then echo xx is defined; fi
0 голосов
/ 11 декабря 2014

Это то, что я использую каждый день:

#
# Check if a variable is set
#   param1  name of the variable
#
function is_set()
{
    [[ -n "${1}" ]] && test -n "$(eval "echo "\${${1}+x}"")"
}

Это хорошо работает под Linux и Solaris вплоть до bash 3.0.

bash-3.00$ myvar="TEST"
bash-3.00$ is_set myvar ; echo $?
0
bash-3.00$ mavar=""
bash-3.00$ is_set myvar ; echo $?
0
bash-3.00$ unset myvar
bash-3.00$ is_set myvar ; echo $?
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...