2017-02-17 24 views
0

Мне нужно прочитать переменную в сценарии оболочки и использовать эту переменную для выполнения некоторой операции. Напр. Я читаю переменные рынки от конфигурации и используя эту переменную, чтобы выяснить значение другой переменной команды redis_host_silver_$jчтение переменной в скрипте unix shell и выполнении операции

используется: -

for j in `echo $markets | awk -F"," '{ for(i=1; i<=NF; ++i) print $i }'`; 
do 
    echo $(redis_host_silver_$j); 
done 

Может кто-нибудь помочь мне в этом?

+0

им, как показано ниже: - + для j в '' echo $ markets | awk -F "," '\' '{для (i = 1; i <= NF; ++ i) print $ i}' \ '' '' ++ redis_host_silver_uk test.sh: строка 61: redis_host_silver_uk: команда не найдена –

+0

Попробуйте указать вокруг своего эха, например 'echo 'redis_host_silver_ $ j"; ' – Jack

+0

Также, если у вас есть разрешения на это, было бы полезно изменить исходный вопрос, чтобы добавить сообщение об ошибке – Jack

ответ

1

Ошибка в части echo $(redis_host_silver_$j);.

$() синтаксис в Баш расширяет то, что внутри, как команды, так что вы на самом деле пытаетесь выполнить redis_host_silver_$j

Try:

for j in `echo $markets | awk -F"," '{ for(i=1; i<=NF; ++i) print $i }'`; 
do 
    echo "redis_host_silver_$j"; 
done 

Если redis_host_silver_... это имя переменной, которая вам то необходимо сделать следующее:

for j in `echo $markets | awk -F"," '{ for(i=1; i<=NF; ++i) print $i }'`; 
do 
    VAR=redis_host_silver_$j; echo ${!VAR}; 
done 

Обратите внимание на фигурные скобки

+0

Большое спасибо! этот хак работал .. –

+0

Рад помочь. Какой метод вы использовали? – Jack

+0

Косвенное расширение кажется гораздо лучшим вариантом, чем 'eval' ... (Вот как я бы подошел ...) –

0

Лично я буду избегать использования цикла for для считывания данных непосредственно из замещения процесса, которые могут иметь или не иметь пробелов в нем. И хотя косвенный вызов может работать, я бы сказал, что ваш тип переменной неверен, а вторая переменная, redis_host_silver, на самом деле должна быть массивом с элементами из файла в виде индексов.

Так что, может быть что-то вроде:

IFS="," read -ra items <<<"$markets" 

for item in "${items[@]}" 
do 
    echo "${redis_host_silver[$item]}" 
done 

Если значение от «рынка» является числом, то «пункт» переменный в вызове массив не требуется «$» получает ошибки