当我这样做时:
arr=($(echo '{"crew":[{"name":"kirk"},{"name":"bones"},{"name":"mr spock"}]}' | jq -r '.crew[].name | @sh'))
I get:
echo "${arr[2]}"
mr
echo "${arr[3]}"
spock
但是当我这样做时:
arr=("kirk" "bones" "mr spock")
我明白了:
echo "${arr[2]}"
mr spock
在第一个示例中,为什么 bash 在创建数组时忽略每个 jq 值所包含的引号?
$ ary=($(echo '{"crew":[{"name":"kirk"},{"name":"bones"},{"name":"mr spock"}]}' | jq -r '.crew[].name | @sh'))
$ declare -p ary
declare -a ary=([0]="'kirk'" [1]="'bones'" [2]="'mr" [3]="spock'")
这不会按预期工作,因为命令替换未加引号,bash 将对输出执行分词。实际输出包含引号字符并不重要。参考3.5 外壳扩展在手册中
您需要延迟数组分配,直到 shell 可以检查输出的内容。这could完成eval
,但对于变量赋值,最好用declare
:
$ declare -a "ary=($(echo '{"crew":[{"name":"kirk"},{"name":"bones"},{"name":"mr spock"}]}' | jq -r '.crew[].name | @sh'))"
$ declare -p ary
declare -a ary=([0]="kirk" [1]="bones" [2]="mr spock")
为了便于阅读,将其分为几个步骤:
$ jq_out=$(echo '{"crew":[{"name":"kirk"},{"name":"bones"},{"name":"mr spock"}]}' | jq -r '.crew[].name | @sh')
$ declare -a "ary=( $jq_out )"
$ declare -p ary
declare -a ary=([0]="kirk" [1]="bones" [2]="mr spock")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)