bash - 为什么 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
- json_file.json
- 静态.json
脚本.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"
问题不再出现
解决方案
问题很简单。
这不是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 )