如何在 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')
如果在控制台中启动,以下命令可以正常工作:
/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')