Как мне проверить, существует ли переменная в операторе 'if'?

Это похоже на таблицу разделов на /dev/sda был уничтожен. Вы не упоминали то, что Вы сделали для уничтожения его, таким образом, трудно сказать точно, как Вы восстановили бы его.

  • Можно попытаться использовать fdisk воссоздать sda1 раздел.

    При условии, что разделы диска этих трех дисков были идентичны, можно воссоздать sda1 раздел с fdisk /dev/sda1 и те же параметры как на других двух дисках. Если корректный, это должно сделать объем видимым снова. (Вы, возможно, должны перезагрузить позже.)

  • Если это перестало работать, можно попытаться использовать TestDisk для воссоздания sda1 раздел.

    Это просканирует диск и попытается определить местоположение метаданных, которые указывают на то, что было на диске и где, но это может дать ложные положительные стороны. Вы отчасти самостоятельно здесь.

70
13.04.2017, 15:36
11 ответов

В modern bash (версия 4.2 и выше):

[[ -v name_of_var ]]

From help test:

-v VAR, True if the shell variable VAR is set

100
27.01.2020, 19:31

POSIXly:

! (: "${somevar?}") 2>/dev/null && echo somevar unset

или вы можете позволить вашей оболочке показать вам сообщение:

(: "${somevar?}")
zsh: somevar: parameter not set
4
27.01.2020, 19:31
if set|grep '^somevar=' >/dev/null;then
    echo "somevar exists"
else
    echo "does not exist"
fi
2
27.01.2020, 19:31

Вы не можете использовать ] if команда для проверки существования объявленных переменных в bash, однако параметр -v существует в более новом bash, но он не переносится, и вы не можете использовать его в более старом bash версии. Потому что, когда вы используете переменную, если она не существует, она родится одновременно.

Например. Представьте, что я не использовал и не присваивал значение переменной MYTEST , но когда вы используете команду echo, она ничего вам не показывает! Или, если вы используете if [-z $ MYTEST] , он вернул нулевое значение! Он не вернул другой статус выхода, который сообщает вам, что этой переменной не существует!

Теперь у вас есть два решения (Без параметра -v ):

  1. Использование команды declare .
  2. С помощью команды установить .

Например:

MYTEST=2
set | grep MYTEST
declare | grep MYTEST

Но, к сожалению, эти команды показывают, что вы также загружаете функции в память! Вы можете использовать declare -p | grep -q МОЙТЕСТ; echo $? для более чистого результата.

0
27.01.2020, 19:31
printf ${var+'$var exists!\n'}

... не будет печатать вообще ничего, если не будет. Или...

printf $"var does%${var+.}s exist%c\n" \ not !

... скажет в любом случае.

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

[ "${var+1}" ]
printf $"var does%.$?0s exist%c\n" \ not !

Вы также можете сделать ошибку printf, основанную на подстановке.....

printf $"var does%${var+.}s exist%c\n%.${var+b}d" \
        \ not ! \\c >&"$((2${var+-1}))" 2>/dev/null

... которая печатает $var не существует! в stderr и возвращает кроме 0, когда $var не установлен, но отпечатки $var действительно существуют! на stdout и возвращает 0, когда установлен $var.

2
27.01.2020, 19:31

Я думаю, что вы ищете команду udevadm . Параметры trigger и test используются для запуска повторного сканирования событий udev и тестирования конкретного события соответственно.

Я усвоил это трудный способ при использовании нового имени сетевого устройства в EL 7. Удачи!

-121--29338-

Установив shell =/usr/bin/zsh\-l в .vimrc решил мою проблему

Примечание:

Я использую: linux mint 17,1

-121--37302-

Как упоминалось в ответе на SO , вот способ проверки:

if [ -z ${somevar+x} ]; then echo "somevar is unset"; else echo "somevar is set to '$somevar'"; fi

где $ {somevar + x} - расширение параметра, которое вычисляется как null, если var не установлен и заменяет последовательность «x» в противном случае.

При использовании -n , как предлагается в другом ответе, проверяется только то, содержит ли переменная пустые последовательности. Она не будет проверять свое существование.

9
27.01.2020, 19:31

Зависит от того, что вы подразумеваете под существует .

Существует ли переменная, которая была объявлена, но не присвоена ?

Существует ли переменная массива (или хэша), которой был назначен пустой список ?

Существует ли переменная nameref, указывающая на переменную, которая в настоящее время не назначена ?

Считаете ли вы переменные $ - , $ # , $ 1 ? (POSIX этого не делает).

В оболочках типа Борна канонический способ:

if [ -n "${var+set}" ]; then
  echo '$var was set'
fi

Он работает для скалярных переменных и других параметров, чтобы определить, было ли переменной присвоено значение (пустое или нет, автоматически из среды, присваивается, читать , вместо или другое).

Для оболочек, которые имеют команду typeset или declare , это не будет сообщать как set переменные, которые были объявлены , но не назначен , за исключением zsh .

Для оболочек, поддерживающих массивы, за исключением yash и zsh , которые не будут сообщать как набор переменных массива, если не установлен элемент индекса 0.

Для bash (но не ksh93 и zsh ), для переменных типа ассоциативный массив , это не будет сообщать их как устанавливает , если их элемент ключа «0» не был установлен.

Для ksh93 и bash , для переменных типа nameref , это возвращает true, только если переменная, на которую ссылается nameref, сама считается установленной. .

Для ksh , zsh и bash потенциально лучшим подходом может быть:

if ((${#var[@]})); then
  echo '$var (or the variable it references for namerefs) or any of its elements for array/hashes has been set'
fi

Для ksh93 , zsh и bash 4.4 или выше, также есть:

if typeset -p var 2> /dev/null | grep -q '^'; then
  echo '$var exists'
fi

Который будет сообщать о переменных, которые были установлены или объявлены.

25
27.01.2020, 19:31

Эта простая строка работает (и работает на большинстве оболочек POSIX):

${var+"false"} && echo "var is unset"

Или, написанная в более длинной форме:

unset var

if ${var+"false"}
then
   echo "var is unset"
fi

Расширение:

  • Если var имеет значение (даже null), false заменяется
  • Если var имеет «no value», то «no value» (null) заменяется.

Расширение $ {var + «false»} расширяется до значения «null», равного «false».
Затем выполняется «nothing» или «false» и устанавливается код выхода.

Нет необходимости вызывать команду test ( [ или [[), так как значение выхода устанавливается (выполнением) самого расширения.

1
27.01.2020, 19:31

Функция для проверки объявления/отмены переменной

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


В дополнение к ответу @Gilles

case " ${!foobar*} "*в
 *) echo "foobar объявлен";;
 *) echo "foobar не объявлен";;
esac

- для которого я не нашел способа заключить его в функцию - я хотел бы добавить простую версию, которая частично основана на Richard Hansenanswer, но также рассматривает подводный камень, который возникает с пустым 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=(), вызов declare гарантирует, что мы получим правильный результат
  • В /dev/null никогда не передается много данных, поскольку declare вызывается только в том случае, если либо переменная не установлена, либо массив пуст.


С помощью следующего кода можно протестировать функции:

( # start a subshell to encapsulate functions/vars for easy copy-paste into the terminal
  # do not use this extra parenthesis () in a script!

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

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

:;       echo -n 'a;       '; var_is_declared a && echo "# is declared" || echo "# is not declared"
a=;      echo -n 'a=;      '; var_is_declared a && echo "# is declared" || echo "# is not declared"
a="sd";  echo -n 'a="sd";  '; var_is_declared a && echo "# is declared" || echo "# is not declared"
a=();    echo -n 'a=();    '; var_is_declared a && echo "# is declared" || echo "# is not declared"
a=("");  echo -n 'a=("");  '; var_is_declared a && echo "# is declared" || echo "# is not declared"
unset a; echo -n 'unset a; '; var_is_declared a && echo "# is declared" || echo "# is not declared"
echo ;
:;       echo -n 'a;       '; var_is_unset a && echo "# is unset" || echo "# is not unset"
a=;      echo -n 'a=;      '; var_is_unset a && echo "# is unset" || echo "# is not unset"
a="foo"; echo -n 'a="foo"; '; var_is_unset a && echo "# is unset" || echo "# is not unset"
a=();    echo -n 'a=();    '; var_is_unset a && echo "# is unset" || echo "# is not unset"
a=("");  echo -n 'a=("");  '; var_is_unset a && echo "# is unset" || echo "# is not unset"
unset a; echo -n 'unset a; '; var_is_unset a && echo "# is unset" || echo "# is not unset"
)

Сценарий должен вернуть

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
0
27.01.2020, 19:31

Путь чистой оболочки:

[ "${var+1}" ] || echo "The variable has not been set"

Тестовый сценарий:

#!/bin/sh
echo "Test 1, var has not yet been created"
[ "${var+1}" ] || echo "The variable has not been set"

echo "Test 2, var=1"
var=1
[ "${var+1}" ] || echo "The variable has not been set"

echo "Test 3, var="
var=
[ "${var+1}" ] || echo "The variable has not been set"

echo "Test 4, unset var"
unset var
[ "${var+1}" ] || echo "The variable has not been set"
echo "Done"

Результаты:

Test 1, var has not yet been created
The variable has not been set
Test 2, var=1
Test 3, var=
Test 4, unset var
The variable has not been set
Done
1
27.01.2020, 19:31

С bash 4.4.19 у меня сработало следующее. Вот полный пример

$export MAGENTO_DB_HOST="anyvalue"

#!/bin/bash

if [ -z "$MAGENTO_DB_HOST" ]; then
    echo "Magento variable not set"
else
    echo $MAGENTO_DB_HOST
fi
1
27.01.2020, 19:31

Теги

Похожие вопросы