如何将 jq 值传递给 linux bash 脚本中的变量

How to pass jq values to a variable in linux bash script

有人可以帮帮我吗?

我正在做一个 raspberry pi 项目,我想从云端控制我的引脚。我有这个 bash 脚本,它定期连接到 Web 服务以检查此响应。 {"status":1,"pin":4}

我正在使用 jq 并且我能够使用

获得我需要的值
source gpio

foo = $(curl '{webservice_url}')
echo ${foo} | jq '.status'
echo ${foo} | jq '.pin'

输出:1 和 4

问题是当我尝试将值传递给变量并使用它们时它不起作用

我试过了:

 foo = $(curl '{webservice_url}')
 status = `${foo} | jq '.status'`
 pin = `${foo} | jq '.pin'`

 echo "$status"
 echo "$pin"

我尝试使用 echo ${status} 并且仍然 错误说
状态:未找到命令
引脚:未找到命令

我也试过了

source gpio
while true; do
   foo = $(curl '{webservice_url}')
   gpio mode "${foo} | jq '.pin'" out
   gpio write "${foo} | jq '.status'" 1 
   sleep 1
done

但它不起作用。

提前致谢

这是一个说明,说明如何使用 bash 和 jq 实现您想要的效果:

# foo=$(curl '{webservice_url}')
foo='{"status": "S", "pin": "P"}'
status=$(jq .status <<< ${foo})
pin=$(jq .pin  <<< ${foo})

echo "$status"
echo "$pin"

由于这涉及对每个变量调用一次 jq,因此使用另一种方法可能是值得的。如果您的 bash 有 readarray(又名 mapfile),那么请考虑:

readarray -t lines <<< $(jq -cr .status,.pin <<< ${foo})
status=${lines[0]}
pin=${lines[1]}

否则:

i=0
while read -r line
do
    i=$((i+1))
    a[$i]="$line"
done < <(jq -cr .status,.pin <<< ${foo})

使用@tsv

这里有一个稍微不同的方法,它依赖于文字制表符不能出现在 JSON 字符串中这一事实:

IFS=$'\t' read status pin < <(jq -r '[.status,.pin]|@tsv' <<< ${foo})