2014-11-24 2 views
5

Мне нужно выполнить функцию, которая должна быть проверена, если переменная была правильно определена в bash и должна использовать связанное с ней значение.Как проверить, существует ли переменная и была ли она инициализирована

Например, эти переменные инициализируются в верхней части скрипта.

#!/bin/bash 

var1_ID=0x04 
var2_ID=0x05 
var3_ID=0x06 
var4_ID=0x09 

Я хотел бы назвать именем тест сценария следующим образом:

./test var1 

В настоящее время реализована функция:

function Get() 
{ 
    if [ $1"_ID" != "" ]; then 
     echo "here" 
     echo $(($1_ID)) 
    else 
     exit 0 
    fi 
} 

Я не понимаю, почему я получаю here даже если Я ввожу ./test toto или что-то еще.

Нужно ли использовать определенную команду, например grep?

+0

Связано: [Как проверить, определена ли переменная в Bash до версии 4.2 с помощью опции оболочки nounset?] (Http://unix.stackexchange.com/a/56846/40596) – fedorqui

+1

Кажется, никто это, но '$ 1" _ID "' будет оценивать '' _ID ", если' $ 1' не существует. И поэтому ВСЕГДА будет '! = До" "' –

ответ

8

Вы, вероятно, хотите использовать косвенное расширение: ${!variable}, а затем -n, чтобы проверить, если он был определен :

Косвенное расширение состоит в вызове переменной с другой переменной. То есть, поскольку имя переменной может меняться, вместо того, чтобы говорить $a, мы говорим ${!var} и var=a.

$ cat a 
var1_ID=0x04 
var2_ID=0x05 
var3_ID=0x06 
var4_ID=0x09 

for i in {1..5}; do 
    v="var${i}_ID" 
    if [ -n "${!v}" ]; then    # <-- this expands to varX_ID 
     echo "$v set to value: ${!v}" 
    else 
     echo "$v not set" 
    fi 
done 

Если мы выполняем, мы получаем:

$ ./a 
var1_ID set to value: 0x04 
var2_ID set to value: 0x05 
var3_ID set to value: 0x06 
var4_ID set to value: 0x09 
var5_ID not set 

От man test:

-n STRING

длина СТРОКИ отлична от нуля

+1

Спасибо fedorqui. Однако я не понимаю. Что означает $ {! V}? – ogs

+0

Это называется ** косвенным расширением **. Он состоит в вызове переменной с другой переменной. То есть, поскольку имя переменной может меняться, вместо того, чтобы говорить '$ a', мы говорим' $ {! Var} и 'var = a'. Вы можете прочитать больше в [bash: косвенное расширение, пожалуйста, объясните?] (Http://stackoverflow.com/q/8515411/1983854). – fedorqui

+0

Действительно приятно! Большое спасибо – ogs

5

расширение использования параметра:

: ${var:?} 

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

: ${var?} 

Если вы не хотите сценария, чтобы остановить на проблеме, вы можете использовать

if [[ ${var:+1} ]] ; then 
    # OK... 
else 
    echo Variable empty or not defined. >&2 
fi 
3

В bash 4.2 вы можете использовать оператор -v в условном выражении, чтобы проверить, установлена ​​ли переменная с заданным именем.

if [[ -v ${1}_ID ]]; then 
    echo "${1}_ID is set" 
    foo=${1}_ID 
    echo "${!foo}" 
fi 

Для получения значения по-прежнему требуется косвенное расширение параметра.

В bash 4.3 вы можете использовать именованную ссылку, чтобы упростить работу с ней.

declare -n param=${1}_ID 
if [[ -v param ]]; then 
    echo "${1}_ID" 
    echo "$param" 
fi 

(param будет вести себя так же, как переменной она ссылается. Я не знаю, если есть простой способ, не хватает анализа вывода declare -p param, чтобы получить имя ссылки переменной его.)

Смежные вопросы