首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么jq在脚本中运行时看不到环境变量?

为什么jq在脚本中运行时看不到环境变量?
EN

Stack Overflow用户
提问于 2020-06-30 06:53:04
回答 1查看 341关注 0票数 0

我有以下JSON文件:

代码语言:javascript
复制
{
"1":
 {
   "media_content":"test3.xspf"
 },
"2":
 {
   "media_content":"test3.xspf"
 }
}

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

代码语言:javascript
复制
export schedules="1"
echo $(jq '.[env.schedules]["media_content"]' json_file.json)

其结果是输出:

代码语言:javascript
复制
test3.xspf

因此,它按预期工作,但当我将jq命令放入脚本并运行它时,它只返回null。我确实回显了计划的值,以确保脚本中的值为非空值,这是可以的:

代码语言:javascript
复制
echo $schedules

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

我以以下方式运行该脚本:

代码语言:javascript
复制
bash script.sh
./script.sh

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

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

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

有一个目录,其中包括:

  • script.sh
  • json_file.json
  • static.json

script.sh:

代码语言:javascript
复制
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:

代码语言:javascript
复制
{
"1":
 {
   "media_content":"test3.xspf"
 },
"2":
 {
   "media_content":"test3.xspf"
 }
}

static.json:

代码语言:javascript
复制
{
"1":
 {
   "x": "0",
   "y": "0",
   "width": "960",
   "height": "540",
   "schedules":"1"
 }
}

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

代码语言:javascript
复制
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

如果我硬编码变量:

代码语言:javascript
复制
export schedules="1"   

这个问题不再发生。

EN

回答 1

Stack Overflow用户

发布于 2020-06-30 09:45:07

问题很简单。

这不是jq的错。

这是调度值传递到下一个命令的不恰当的方式。

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

代码语言:javascript
复制
    export schedules="$(echo $zone | jq '.schedules')"
    schedules=$( echo $schedules | sed s/\"//g )

长答案让我们看看:

在这里,计划是一个字符串,echo将其值显示为1:

代码语言:javascript
复制
export schedules="1" ; echo $schedules 

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

代码语言:javascript
复制
export schedules=1 ; echo $schedules 

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

代码语言:javascript
复制
export schedules=$(echo $zone | jq '.schedules')

如果您现在打印它,您将看到其他“s”:

代码语言:javascript
复制
echo $schedules # "1"

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

代码语言:javascript
复制
schedules=$( echo $schedules | sed s/\"//g )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62651799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档