【问题标题】:create variable with name of other variable使用其他变量的名称创建变量
【发布时间】:2014-01-07 16:04:28
【问题描述】:
很难找到这个的标题:D
我有这个代码:
data=( "slots" "npcs" )
for i in "${data[@]}"
do
"$i"=$(mysql_exec "SELECT $i FROM orders WHERE order_id = $order") # slots returns 5 and npcs returns 1
done
在循环中,我想使用来自$i 的内容名称创建一个变量。
所以它应该创建一个名为slots (content: 5)和npcs (content: 1)的变量
希望你能理解我的问题:P
错误:
./install: Line 16: slots=5: command not found.
./install: Line 16: npcs=1: command not found.
【问题讨论】:
标签:
linux
bash
variables
loops
【解决方案1】:
您可以使用declare 命令即时创建变量名称。
data=( "slots" "npcs" )
for i in "${data[@]}"
do
declare "$i=$(mysql_exec "SELECT $i FROM orders WHERE order_id = $order")" # slots returns 5 and npcs returns 1
done
read 命令也可以与过程变电站结合使用
read $i < <(mysql_exec "SELECT $i FROM orders WHERE order_id = $order")
不过,请考虑一下,这两种方法是否真的优于简单的写作
grab_from_sql () {
mysql_exec "SELECT $1 FROM orders WHERE order_id = $2"
}
slots=$(grab_from_sql slots $order)
npcs=$(grab_from_sql npcs $order)
【解决方案2】:
如果你有 bash 4,你可以使用关联数组:
data=(slots npcs)
declare -A res
for i in "${data[@]}"; do
res[i]=$(mysql …)
done
如果您没有支持关联数组的 shell,那么使用 shell 将无法很好地做到这一点。考虑使用脚本语言。你可以使用awk,如果其他方法都失败了,它支持关联数组。使用awk中的system函数执行mysql命令。