使用变量contening键初始化数组

时间:2016-11-03 16:15:17

标签: bash

我想构建一个带有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初始化数组?

1 个答案:

答案 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')