首页 > 解决方案 > 为什么 jq 在脚本中运行时看不到环境变量?

问题描述

我有以下 JSON 文件:

{
"1":
 {
   "media_content":"test3.xspf"
 },
"2":
 {
   "media_content":"test3.xspf"
 }
}

在终端中,使用 bash 作为 shell,我可以执行以下命令:

export schedules="1"
echo $(jq '.[env.schedules]["media_content"]' json_file.json)

这导致输出:

test3.xspf

所以它按预期工作,但是当我将该 jq 命令放在脚本中并运行它时,它只返回 null。我确实回显了时间表的值,以确保脚本中的值不为空,这没关系:

echo $schedules

但是我没有找到原因,为什么这个命令在直接在 shell 中运行时有效,而在脚本中运行时无效。

我通过以下方式运行脚本:

bash script.sh
./script.sh

PS:是的,我确实提供了执行权限: chmod +x script.sh

提示:env.schedules代表环境变量'schedules',我确实确保在调用之前在脚本中分配了它jq

编辑:我现在发布一个完整的脚本,指定文件树。

有一个目录包含:

脚本.sh:

export zone=$(cat static.json | jq '.["1"]');

echo "json block: "$zone

export schedules="$(echo $zone | jq '.schedules')"

echo "environment variable: "$schedules
export media_content=$(jq '.[env.schedules]["media_content"]' json_file.json)

echo "What I want to get: \"test3.xspf\""
echo "What I get: "$media_content

json_file.json:

{
"1":
 {
   "media_content":"test3.xspf"
 },
"2":
 {
   "media_content":"test3.xspf"
 }
}

静态.json:

{
"1":
 {
   "x": "0",
   "y": "0",
   "width": "960",
   "height": "540",
   "schedules":"1"
 }
}

如果我运行脚本,它会显示:

json block: { "x": "0", "y": "0", "width": "960", "height": "540", "schedules": "1" }
environment variable: "1"
What I want to get: "test3.xspf"
What I get: null

如果我对变量进行硬编码:

export schedules="1"   

问题不再出现

标签: bashshelljq

解决方案


问题很简单。
这不是jq的错。
它以不正确的方式将计划的值通过管道传递到下一个命令。

您必须删除围绕变量值的 "s,添加使用 sed 执行此操作的第二个命令:

    export schedules="$(echo $zone | jq '.schedules')"
    schedules=$( echo $schedules | sed s/\"//g )

长答案 让我们看看:
这里的 schedules 是一个字符串,echo 显示它的值为 1:

export schedules="1" ; echo $schedules 

这里即使没有提到双引号:

export schedules=1 ; echo $schedules 

但由此产生的结果也会产生额外的“s:

export schedules=$(echo $zone | jq '.schedules')

如果您现在打印它,您将看到额外的“s:

echo $schedules # "1"

因此,只需从值中删除 "s:

schedules=$( echo $schedules | sed s/\"//g )

推荐阅读