Я не могу исказить $ определения? =, “вводят $? || отзываются эхом 'varible не определенный'”

Я хочу создать псевдоним, названный определением, которое берет varible и проверяет, определяется ли оно. Если это не печать определения 'varible, не определяется.

1
задан 16 September 2014 в 08:28

3 ответа

Следующая функция распечатает сообщение об ошибке, если данный название переменной, которая является пустой или неопределенной:

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
2
ответ дан 10 November 2019 в 19:22

Начиная с 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
1
ответ дан 10 November 2019 в 19:22

Согласно усовершенствованному руководству по созданию сценариев Bash:

В сценарии псевдонимы имеют очень ограниченную полноценность. Было бы хорошо, если псевдонимы могли бы принять часть функциональности препроцессора C, такого как макрорасширение, но к сожалению Bash не разворачивает аргументы в теле псевдонима. [117], Кроме того, сценарию не удается развернуть сам псевдоним в "составных конструкциях", таких как условные операторы, циклы и функции. Добавленное ограничение - то, что псевдоним не расширится рекурсивно. Почти неизменно, независимо от того, что мы хотели бы, чтобы псевдоним сделал, мог быть выполнен намного эффективнее с функцией.

Поэтому необходимо следовать ответу Eliah Kagan или John1024.

0
ответ дан 7 December 2019 в 12:49

Другие вопросы по тегам:

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