在Bash中使用jq遍历JSON数组时无法提取多个键的求助
JSON数组多字段提取问题解决
问题场景
以下脚本遍历JSON数组时,提取path_with_namespace字段正常,但提取path字段时抛出jq: command not found错误:
#!/bin/sh -e cat << EOF > error.json [ { "path": "path1", "path_with_namespace": "path_with_namespace1" }, { "path": "path2", "path_with_namespace": "path_with_namespace2" } ] EOF jq -c '.[]' error.json | while read PROJECT; do # 此部分正常工作 PATH_WITH_NAMESPACE=$(echo "$PROJECT" | jq .path_with_namespace) echo "Shallow cloning $PATH_WITH_NAMESPACE ..." # 此部分无法工作 PATH=$(echo "$PROJECT" | jq .path) echo "$PATH" done
执行输出:
$ ./error.sh Shallow cloning "path_with_namespace1" ... "path1" ./error.sh: line 18: jq: command not found
错误原因
PATH是shell内置环境变量,用于指定系统查找可执行命令的路径。当你将自定义变量命名为PATH时,会覆盖原有的环境变量值,导致后续执行jq命令时,shell无法找到该命令的位置,从而抛出"command not found"错误。
解决方案
方案1:更换自定义变量名
避免使用shell内置变量名作为自定义变量,比如将PATH改为PROJECT_PATH:
#!/bin/sh -e cat << EOF > error.json [ { "path": "path1", "path_with_namespace": "path_with_namespace1" }, { "path": "path2", "path_with_namespace": "path_with_namespace2" } ] EOF jq -c '.[]' error.json | while read PROJECT; do PATH_WITH_NAMESPACE=$(echo "$PROJECT" | jq .path_with_namespace) echo "Shallow cloning $PATH_WITH_NAMESPACE ..." # 修改变量名,避免覆盖内置PATH PROJECT_PATH=$(echo "$PROJECT" | jq .path) echo "$PROJECT_PATH" done
方案2:一次性提取多个字段(更高效)
无需循环调用jq,直接让jq输出多个字段的格式化内容,再用shell读取,减少进程开销:
#!/bin/sh -e cat << EOF > error.json [ { "path": "path1", "path_with_namespace": "path_with_namespace1" }, { "path": "path2", "path_with_namespace": "path_with_namespace2" } ] EOF # 用jq一次性提取两个字段,以制表符分隔 jq -r '.[] | "\(.path_with_namespace)\t\(.path)"' error.json | while read -r PATH_WITH_NAMESPACE PROJECT_PATH; do echo "Shallow cloning \"$PATH_WITH_NAMESPACE\" ..." echo "$PROJECT_PATH" done
执行输出:
$ ./error.sh Shallow cloning "path_with_namespace1" ... path1 Shallow cloning "path_with_namespace2" ... path2
注意:使用-r参数让jq输出原始字符串(不带引号),用read -r避免反斜杠转义问题。
内容的提问来源于stack exchange,提问作者mles
相关产品推荐
相关产品推荐

