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

Предположим, у меня есть что-то вроде ниже:

eval link='/var/lib/${XYZ}/test' # string from another text file

XYZ только для примера, и это может быть что-то вроде ниже:

eval link='/var/lib/${MY_OWN_VAR}/test' # single quote here not double quotes
eval link='/var/lib/${WHAT_EVER}/test'

Возможно ли выдать ошибкуесли XYZ не установлено?или есть какой-то другой способ выяснить, установлен XYZ или нет?

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

ОБНОВЛЕНИЕ

Для ясности, все строки, которые необходимо оценить, взяты из текстового файла.в основном программа читает текстовый файл и выводит оцененные строки.

Все, что я пытаюсь здесь сделать, - это найти способ изящно отловить ошибку «несвязанная переменная» при оценке любой строки.в основном то, что делает set -u, но изящно.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Вы можете проверить eval в подоболочке, прежде чем выполнить его по-настоящему:

assign_if_defined(){
    echo 1>&2 "testing $1=$2"
    outvar="$1"
    input=${2@Q}
    err=$(exec 2>&1; set -u; eval "${outvar}=${input@P}")
    if [ -z "$err" ]; then
        echo 1>&2 "eval test succeeded: doing for real"
        eval "${outvar}=${input@P}"
    else
        echo 1>&2 "eval test failed: not doing for real"
        echo 1>&2 "error: $err"
    fi
}

A=set
assign_if_defined link1 "'"'"\/${A}/'
echo link1=$link1

unset B
assign_if_defined link2 '/$B/'
echo link2=$link2

Кажется, что преобразования @Q / @P впервые появились в bash 4.4.Использование их означает, что цитирование значительно упрощается.Если вы используете более старую версию bash, вы можете попробовать использовать обычные кавычки (eval "${outvar}=\"${input}\""), но код не будет работать, если input содержит специальные символы (как в первом примере).

0 голосов
/ 30 января 2019

Ну, я не знаю точно, сколько контроля (или знаний) вы делаете над строками, но вы не можете просто проверить, пусто ли оно?

VAR=mydirectory
str=/var/lib/${VAR}/test             # valid
str2=/var/lib/${NONEXISTANT}/test    # invalid

if [[ "$str" = "/var/lib//test" ]] ;
then
    echo 'is_empty';
else
    echo 'is_set';
fi;

Единственным недостатком является то, что тест не пройден, если вы получите переменную, которая установлена, но пуста, например, VAR=""

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...