如何将 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})
有人可以帮帮我吗?
我正在做一个 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})