Я хочу создать псевдоним, названный определением, которое берет varible и проверяет, определяется ли оно. Если это не печать определения 'varible, не определяется.
Следующая функция распечатает сообщение об ошибке, если данный название переменной, которая является пустой или неопределенной:
def() { : "${!1:? "Variable not defined."}" ; }
Примеры:
$ def PATH
$ def NONESUCH
bash: !1: Variable not defined.
Эта функция требует bash
.
Тело функции состоит из одной команды, которой дают один аргумент. Команда :
который действует как без операций. Аргумент той команде "${!1:? "Variable not defined."}"
. В bash,
конструкция ${!1}
возвращает значение переменной, именем которой дают $1
, первый аргумент функции. Если переменная, имя которой $1
установлен и не пустой, затем "${!1:? "Variable not defined."}"
возвращает его значение. Его значение проигнорировано :
потому что :
нет. Если переменная с тем именем или сброшена или пустой указатель, то, из-за :?
конструкция расширения параметра, данное сообщение об ошибке возвращается.
Вышеупомянутая функция не возвратила точно сообщение, что Вы попросили. Мы можем зафиксировать это:
$ def() { ( : "${!1:? "Variable not defined."}" ) 2>&1 | sed 's/^bash: !1: //'; }
$ def NONESUCH
Variable not defined.
Или,
$ def() { ( : "${!1:?}" ) 2>/dev/null || echo "Variable not defined"; }
$ def NONESUCH
Variable not defined
Начиная с Ubuntu 12.04 LTS (и возможно немного перед этим, но не еще 10.04 LTS), bash
версия в Ubuntu была по крайней мере 4,2. Таким образом это поддерживает -v
оператор для test
, [
, и [[
builtins.
Если Вы только изучаете один способ протестировать, если переменные определяются в ударе, это должен, вероятно, быть метод расширения параметра, используемый в превосходном ответе John1024. Даже при том, что системы Ubuntu с помощью удара 4.1 и ранее становятся все больше редкими, 10.04 все еще ограничил поддержку сервера, и более ранние версии удара намного более распространены в некоторых других системах GNU/Linux (и другие подобные Unix Ose).
Но если у Вас есть удар 4.2 или выше, "улучшенный выходной формат" из ответа John1024 может быть далее упрощен до:
def() { [ -v "$1" ] || echo 'Variable not defined'; }
Отметьте это если foo
название переменной, Вы интересуетесь, [ -v foo ]
- нет [ -v $foo ]
- тесты, если это определяется. В этом случае я имею $1
потому что первый позиционный параметр передал def
будет содержать название переменной, которая будет протестирована как ее значение. ( $
в моем примере достигает того же дополнительного уровня абстракции, достигнутого !
в ${...}
выражение примера John1024.)
ek@Ilex:~$ def() { [ -v "$1" ] || echo 'Variable not defined'; }
ek@Ilex:~$ def PATH
ek@Ilex:~$ def NONESUCH
Variable not defined
И мой и John1024 def
реализации распечатают Variable not defined
:
def
.Это:
ek@Ilex:~$ def
Variable not defined
Если Вы предпочли бы отдельное сообщение в той ситуации, можно обработать случай def
получение никаких аргументов отдельно:
def() {
if [ $# -eq 0 ]; then
echo 'error: too few arguments' >&2
return 1
elif [ ! -v "$1" ]; then
echo 'Variable not defined'
fi
}
Я записал это на основе идеи это наличие def
первый аргумент существует, называет ли он определенную переменную, считается нормальным функционированием и не ошибкой. Напротив, не передавая аргументов def
ошибка, и я рассматривал ее как таковой:
>&2
отправляет вывод echo
к стандартной погрешности.
return 1
делает def
возвратитесь с ненулевым статусом выхода, указав на отказ. (Это главным образом полезно для когда вызов к def
появится вместо этого составной оператор или сценарий, хотя со статусом выхода последней команды можно также свериться echo $?
.)
В других случаях def
возвратит статус выхода по умолчанию 0 (если, конечно, существует некоторая другая ошибка, такой как echo
неспособность записать Variable not defined
к стандартному выводу).
ek@Ilex:~/source$ def NONESUCH
Variable not defined
ek@Ilex:~/source$ def
error: too few arguments
Согласно усовершенствованному руководству по созданию сценариев Bash:
В сценарии псевдонимы имеют очень ограниченную полноценность. Было бы хорошо, если псевдонимы могли бы принять часть функциональности препроцессора C, такого как макрорасширение, но к сожалению Bash не разворачивает аргументы в теле псевдонима. [117], Кроме того, сценарию не удается развернуть сам псевдоним в "составных конструкциях", таких как условные операторы, циклы и функции. Добавленное ограничение - то, что псевдоним не расширится рекурсивно. Почти неизменно, независимо от того, что мы хотели бы, чтобы псевдоним сделал, мог быть выполнен намного эффективнее с функцией.
Поэтому необходимо следовать ответу Eliah Kagan или John1024.