我可以在这里摆脱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})
答案 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和数组是你最好的选择。