Как объединить 2 переменные в сценарии оболочки? - PullRequest
2 голосов
/ 07 июля 2010
INPUT=10     
OUTPUT_IN=20     
KEYWORD="IN"    
echo $OUTPUT_"$KEYWORD"   

Должно отображаться 20

В основном я ищу для создания имени переменной OUTPUT_IN

Как решить эту проблему?

Ответы [ 2 ]

4 голосов
/ 07 июля 2010

Вы можете использовать косвенное обращение в Bash следующим образом:

INPUT=10     
OUTPUT_IN=20     
KEYWORD="IN"    
var="OUTPUT_$KEYWORD"
echo "${!var}"

Однако вам, вероятно, следует использовать массив или другой метод, чтобы делать то, что вы хотите. От БашЧаВо / 006 :

Размещение имен переменных или любого другого синтаксиса bash внутри параметров, как правило, плохая идея. Это нарушает разделение между кодом и данными; и, как таковая, приводит вас на скользкий путь к ошибкам, проблемам безопасности и т. д. Даже когда вы знаете, что «все правильно», потому что вы «точно знаете и понимаете, что делаете», ошибки случаются со всеми нами, и это окупается. соблюдать правила разделения, чтобы свести к минимуму степень возможного ущерба.

Кроме того, он также делает ваш код неочевидным и непрозрачным.

Обычно в сценариях bash вам вообще не нужны косвенные ссылки. Обычно люди ищут это решение, когда они не понимают или не знают о массивах Bash или еще не полностью рассмотрели другие функции Bash, такие как функции.

И вам следует избегать использования eval, если это вообще возможно. От БашАФК / 048 :

Если переменная содержит команду оболочки, оболочка может выполнить эту команду независимо от того, хотите вы этого или нет. Это может привести к неожиданным результатам, особенно когда переменные могут быть прочитаны из ненадежных источников (таких как пользователи или созданные пользователем файлы).

Bash 4 имеет ассоциативные массивы, которые позволят вам сделать это:

array[in]=10
array[out]=20
index="out"
echo "${array[$index]}"
3 голосов
/ 07 июля 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...