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
我无法解释为什么这有效,或者为什么顺序会改变。
您可以从串联的变量输入中读取 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#*=}"
我正在尝试将字符串读入关联数组。
字符串被正确转义并读入 .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
我无法解释为什么这有效,或者为什么顺序会改变。
您可以从串联的变量输入中读取 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#*=}"