我想构建一个带有SQLite查询结果的arry。 我做了
result=`sqlite3 "$database" 'SELECT id,value FROM table'`
我获得了
1 | id 1的值
2 | id 2的值
(通过defaut,sqlite使用|作为分隔符)。 我想要的是使用 id 作为bash数组中的键,将 value 作为bash值。
如果我直接输入
array=([1]="value for id 1" [2]="value for id 2")
效果很好! 所以我这样修改结果:
result=`sqlite3 "$database" 'SELECT id,value FROM table' | sed 's/^/[' | sed 's/|/]="/' | sed 's/$/"/' | sed ':a;N;$!ba;s/\n/ /g'`
当我回复“$ result”时,我成功地获得了:
[1] =“id 1的值”[2] =“id 2的值”
但是现在,当我做的时候
array=($result)
array=("$result")
array=($(echo -n $result))
array=($(echo -n "$result"))
array=(`echo -n $result`)
array=(`echo -n "$result"`)
它们都不起作用。 如果我做
for i in "${!array[@]}";do
echo "key = $i"
echo "val = ${array[$i]}"
done
我最终得到像
这样的东西key = 0
val = [1] =“value
key = 1
val = for
key = 2
val = id
key = 3
val = 1“
key = 4
val = [2] =“value
key = 5
val = for
key = 6
val = id
key = 7
val = 2“
怎么了?如何使用$ result初始化数组?
答案 0 :(得分:1)
流程替换结果不是eval
作为代码。简而言之,这是一件非常好的事情 - 如果你的价值包含$(rm -rf $HOME)
,你就不会想要它以任何其他方式。
相反,明确地读取您的结果并将它们分配给您的数组:
declare -a array=( )
while IFS='|' read -r key value; do
array[$key]=$value
done < <(sqlite3 "$database" 'SELECT id,value FROM table')