вложенные переменные оболочки без использования eval - PullRequest
9 голосов
/ 25 июля 2011

Могу ли я избавиться от eval здесь?Я пытаюсь установить $current_database с соответствующей переменной, определяемой пользовательским вводом (страна и действие)

# User input
country="es"
action="sales"

# Possible variables for current_database
final_es_sales_path="blahblah/es/sales.csv"
final_en_support_path="yadayada/en/support.csv"
final_it_inventory_path="humhum/it/inventory.csv"
...

current_database=$(eval echo \${final_${country}_${action}_path})

Ответы [ 3 ]

9 голосов
/ 25 июля 2011

Вы можете использовать ассоциативные массивы, объединяя значения обеих переменных.Например:

declare -A databases
# initialization
databases["es:sales"]="blahblah/es/sales.csv"
databases["en:support"]="yadayada/en/support.csv"

Затем вы можете получить базу данных просто:

echo ${databases["${country}:${action}"]}

Преимущество заключается в том, что имена баз данных собираются только одной переменной.

2 голосов
/ 16 октября 2014

На самом деле, да, вы можете, и не прибегая к ассоциативным массивам (это не плохое решение, заметьте).Вы можете использовать решение, подобное следующему:

> current_database=$(echo final_${country}_${action}_path)
> echo $current_database
final_es_sales_path
> current_database=${!current_database}
> echo $current_database
blahblah/es/sales.csv

Это позволяет избежать массивов и обработок с помощью косвенного расширения.Похоже, что это было введено во второй версии Bash, так что практически любая машина должна это делать.

0 голосов
/ 25 июля 2011

не

current_database=${final_${country}_${action}_path}

делай что хочешь?

Редактировать: Нет, это не так. Расширение параметра работает только для одного слова (для имени параметра), и $ не допускается в слове. Тем не менее, было бы возможно использовать вложенное раскрытие параметров в других частях более сложных версий (с ограничениями, заменой, значением по умолчанию и т. Д.), Поэтому здесь перечислены несколько вариантов расширения (которые сначала одурачили меня) (выделение мной):

Когда используются фигурные скобки, соответствующая конечная фигурная скобка является первой ‘}’, которой не предшествует обратная косая черта или внутри строки в кавычках, и не во встроенном арифметическом расширении, подстановка команд, или расширение параметра .

Извините. Похоже, тогда eval и массивы - ваш лучший выбор.

...