Bash中如何将表达式执行结果正确赋值给变量
错误原因
两处变量赋值的语法均不符合Bash管道与命令替换的规则:
cc=$json_data | jq '.country_code':管道仅能传递前一个命令的标准输出,这行的前半段是变量赋值操作,不会输出JSON内容给jq,且管道两端的命令运行在子shell中,赋值操作不会生效到当前shell环境,最终cc为空值。cn=$($json_data | jq '.country_name'):$(...)内部会将内容作为Shell命令执行,此处直接将JSON字符串放在管道起始位置,Shell会把JSON内容识别为要执行的命令,因此触发{"ip":"1.2.3.4",: command not found报错。
正确写法
需要先通过echo/printf输出JSON变量内容,再通过管道传给jq,将完整的管道命令包裹在$(...)内即可将解析结果赋值给变量。如果需要获取不带外层双引号的原始字符串值,可以给jq加-r(raw输出)参数:
#!/bin/bash json_data='{"ip":"1.2.3.4", "country_code":"GB", "country_name":"United Kingdom"}' echo "json_data:" echo "$json_data" # 完整管道命令放在$()内实现结果赋值,-r参数输出无引号的原始值 cc=$(echo "$json_data" | jq -r '.country_code') cn=$(echo "$json_data" | jq -r '.country_name') echo "cc:" echo "$cc" echo "cn:" echo "$cn"
运行结果
json_data: {"ip":"1.2.3.4", "country_code":"GB", "country_name":"United Kingdom"} cc: GB cn: United Kingdom
补充说明:引用变量时建议添加双引号,避免JSON内容包含空格、特殊字符时出现参数拆分、通配符展开等异常问题。
内容的提问来源于stack exchange,提问作者twisted
相关产品推荐
相关产品推荐

