【问题标题】:Assign the return of two piped functions in bash to a variable将 bash 中两个管道函数的返回分配给一个变量
【发布时间】:2022-10-06 14:11:09
【问题描述】:

我通过 unix shell 向公共 API 发出 get 请求。然后我选择一个特定的字符串值对。这工作得很好,但是我无法将它分配给一个名为 max_temperature 的变量。

有人可以帮忙吗?

 response=\"$(curl $url)\"
 max_temperature=$response |  jq \'.[\"main\"].temp_max\'
  • k=v | cmdv 分配给 k 不产生任何输出,然后调用 cmd(没有输入)。两个操作都在子shell中运行(因为|),并且在子shell结束后分配丢失
  • max_temperature=$(curl \"$url\" | jq \'.[\"main\"].temp.max\') 可能是你想要的

标签: bash shell unix


【解决方案1】:

线

 max_temperature=$response |  jq '.["main"].temp_max'

将导致max_temparature var 设置为$response 的内容,并将该语句的输出(在这种情况下没有输出)通过管道传输到jq。

你可能想要的是:

max_temperature=$(echo $response | jq '.["main"].temp_max')

这会产生一个子shell并执行

echo $response | jq '.["main"].temp_max'

在里面。

但是,由于默认情况下子shell 不使用其父环境,所以$response 在回显时将为空。您需要先将其导出到行中。因此:

 response="$(curl $url)"
 export response 
 max_temperature=$(echo $response |  jq '.["main"].temp_max')

更多关于Command substitution

【讨论】:

  • 我相信导出是隐含在$()a=b; bash -c 'echo $a'; echo $(echo "$a"|cat)
  • 非常感谢,这工作。还有一个问题,为什么我必须在响应变量而不是 max_temperature 变量的命令替换周围加上“”?还是没有区别?
  • 你应该使用双引号来避免全局扩展等:echo "$response"。考虑:a='b /*'; echo $a
  • @luke33 如有疑问,请添加双引号。有时它是错误的,但通常不是。参见,例如:unix.stackexchange.com/questions/68694/…
猜你喜欢
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 2012-07-23
相关资源
最近更新 更多