Bash 如何从参数中解析关联数组?

Bash how to parse asscoiative array from argument?

我正在尝试将字符串读入关联数组。

字符串被正确转义并读入 .sh 文件:

./myScript.sh "[\"el1\"]=\"val1\" [\"el2\"]=\"val2\""

在脚本中

#!/bin/bash -e
declare -A myArr=( "" ) #it doesn't work either with or without quotes

我得到的是:

line 2: myArr: "": must use subscript when assigning associative array

谷歌搜索错误只会导致“您的数组格式不正确”结果。

解决方案:

./test.sh "( [\"el1\"]=\"val1\" [\"el2\"]=\"val2\" )"

并在脚本中:

#!/bin/bash -e

declare -A myArr=""
declare -p myArr

for i in "${!myArr[@]}"
do
  echo "key  : $i"
  echo "value: ${myArr[$i]}"
done

Returns:

> ./test.sh "( [\"el1\"]=\"val1\" [\"el2\"]=\"val2\" )"
declare -A myArr=([el2]="val2" [el1]="val1" )
key  : el2
value: val2
key  : el1
value: val1

我无法解释为什么这有效,或者为什么顺序会改变。

Test it yourself here

您可以从串联的变量输入中读取 key/value 对:

$ cat > example.bash <<'EOF'
#!/usr/bin/env bash

declare -A key_values
while true
do
    key_values+=([""]="")
    shift 2
    if [[ $# -eq 0 ]]
    then
        break
    fi
done

for key in "${!key_values[@]}"
do
    echo "${key} = ${key_values[$key]}"
done
EOF
$ chmod u+x example.bash
$ ./example.bash el1 val1 el2 val2
el2 = val2
el1 = val1

无论键和值是什么,这都应该是安全的。

与其关心正确的双重转义,不如在调用方设置变量,并使用 bash declare -p。这样你总能得到正确转义的字符串。

declare -A temp=([el1]=val1 [el2]=val2)
./script.sh "$(declare -p temp)"

然后做:

# ./script.sh
# a safer version of `eval ""`
declare -A myarr="${1#*=}"