You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 23:30:08