如何在 bash 脚本中使用 jq 语法?

How to use jq syntax within a bash script?

如果在控制台中启动,以下命令可以正常工作:

/bin/lshw -quiet -json -C network|/bin/jq '.[1] | .logicalname'

请注意方括号中的 1。

在我的计算机上,此命令提供:

root@t15:/home/hmb# /bin/lshw -quiet -json -C network|/bin/jq '.[1] | .logicalname'
"wlp9s0"
root@t15:/home/hmb# 

当我尝试在这样的 bash 脚本中使用此语法时:

#!/bin/bash
# The next line works:
test1=$(/bin/lshw -quiet -json -C network|/bin/jq '.[1] | .logicalname')
/bin/echo "test1 = $test1"
i=1
# This line doesn't:
test2=$(/bin/lshw -quiet -json -C network|/bin/jq '.[$i] | .logicalname')
/bin/echo "test2 = $test2"

...事情没有按预期工作:

root@t15:/home/hmb/HPT/playground/hmbnetwatch# ./question.sh 
test1 = "wlp9s0"
jq: error: $i is not defined at <top-level>, line 1:
.[$i] | .logicalname  
jq: 1 compile error
test2 = 
root@t15:/home/hmb/HPT/playground/hmbnetwatch# 

我已经测试了 jq 命令中出现的单引号的所有转义方法,但我无法在这些方括号内使用脚本变量。

我设法找到了一种通过使用数组从 lshw 中获取所需信息的方法,但出于好奇,并且由于我投入了数小时的反复试验但没有任何成功,我真的很想知道它是否是不可能在这里使用变量,或者如果有办法的话。

据说这是的副本,但我不这么认为。问题是为什么不应该在 jq 的方括号中注入 shell 变量,这在其他地方并没有真正回答。

不,不要将 shell 变量注入您的 jq 过滤器!而是使用 jq 提供的选项将它们作为变量引入 jq 中。在您的情况下,当使用包含数字的变量时,--argjson 将执行:

i=1
test2=$(/bin/lshw -quiet -json -C network|/bin/jq --argjson i $i '.[$i] | .logicalname')