嵌套的shell变量,不使用eval

时间:2011-07-25 15:59:10

标签: bash shell eval

我可以在这里摆脱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 个答案:

答案 0 :(得分:9)

您可以使用关联数组,连接两个变量的值。例如:

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

然后,您可以通过以下方式获取数据库:

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

这样做的好处是只能通过一个变量收集数据库名称。

答案 1 :(得分:2)

实际上,是的,你可以,而不是诉诸关联数组(这不是一个糟糕的解决方案,请注意)。您可以使用与此类似的解决方案:

> 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的第二个版本中引入的,所以几乎任何机器都应该能够做到。

答案 2 :(得分:0)

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

做你想做的事吗?

编辑:不,它没有。参数扩展仅适用于一个单词(对于参数名称),并且单词中不允许$。可以在更复杂的版本的其他部分中使用嵌套参数扩展(具有限制,替换,默认值等),这就是为什么这里列出了几个扩展变体(这首先欺骗了我)(重点)由我):

  

当使用大括号时,匹配的结束大括号是第一个没有反斜杠转义的'}'   或者在带引号的字符串中,不在嵌入式算术扩展中,命令替换,   或参数扩展

对不起。看起来eval和数组是你最好的选择。