18 March 2014

问题:一个shell变量名为foo,另外一个变量key的值为"foo",需要根据变量key的值来读取上下文中变量名为该key的值value。这种JS中就是window[key],但在shell中怎么实现呢?

我最先想到的是${$key},但是报错bash: ${$key}: bad substitution,随后各种折腾都没搞定。最后求助发布团队的同事,给的方案是:eval echo "$"$key,在cli模式下还可以用eval echo \$$key

foo="bar"
key="foo"
eval echo "$"$key
#>bar

or

foo="bar"
key="foo"
eval echo \$$key
#>bar

真实场景大约是这样的:

fields=("vo" "url" "where" "browser" "location")

vo=""
url="www.iqiyi.com"
where="Local"
browser="Firefox"
location="Local-WPTDriver:Firefox.Cable"
wdDown=5000
wdUp=1000
latency=28

curlFormOpts=""

for field in ${fields[@]}
do
    curlFormOpts=${curlFormOpts}" -F "${field}"="`eval echo "$"$field`
done

echo $curlFormOpts
#>-F vo= -F url=www.iqiyi.com -F where=Local -F browser=Firefox -F location=Local-WPTDriver:Firefox.Cable

完。


2014-08-04 补充:

其实 ${!key}就能满足需求的。 advanced bash-scripting guide中的9.5 Indirect References就是专门讨论这个问题的。



blog comments powered by Disqus