gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:25:21 25 4
gpt4 key购买 nike

有人可以帮帮我吗?

我正在做一个树莓派项目,我想从云端控制我的引脚。我有这个 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} 并且仍然错误说
状态:未找到命令
pin: 命令未找到

我也试过了

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})

关于linux - 如何将 jq 值传递给 linux bash 脚本中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44910010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com