![如何从远程服务器的文件中 jq 一行?](https://linux22.com/image/148383/%E5%A6%82%E4%BD%95%E4%BB%8E%E8%BF%9C%E7%A8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E6%96%87%E4%BB%B6%E4%B8%AD%20jq%20%E4%B8%80%E8%A1%8C%EF%BC%9F.png)
我想检查远程服务器上的特定线路。到目前为止,我可以检查该文件是否存在。但是我可以使用 jq 这样的工具对特定行进行索引吗?
if ssh -q -i $pathToPem $sshUsernameIp [ -f ${remote_serial} ];
then
echo "Serial number is found externally"
serialNumber=$(cat serialNumber.json | jq '.serialNumber')
if ssh -q -i $pathToPem $sshUsernameIp [ "$serialNumber" == "${remote_serial | jq '.serialNumber'}" ];
then
echo "Serial number is same"
else
echo "Serial number is not same"
fi
fi
输出>
Serial number is found externally
./test.sh: line 127: ${remote_serial | jq '.serialNumber'}: bad substitution
如何在 {} 内传递变量?我可以在不使用 scp 的情况下比较这些本地和远程文件吗?
答案1
没必要把事情搞复杂。只需从远程主机获取 JSON 并将其传递给jq
,然后在本地执行相同的操作。然后进行比较。如果远程文件丢失,您将收到错误(我们可以丢弃该错误),并且序列号将比较不同(除非本地序列号也丢失)。
r_serial=$( ssh -q -i "$pathToPem" "$sshUsernameIp" cat "$remote_serial" 2>/dev/null | jq -r '.serialNumber' )
l_serial=$( jq -r '.serialNumber' serialNumber.json )
if [ "$r_serial" = "$l_serial" ]; then
echo 'same'
else
echo 'different (or missing)'
fi
假设这$remote_serial
是远程计算机上 JSON 文档的路径名。
另请注意调用中变量扩展的引用ssh
。
您得到的实际错误来自以下事实:
"${remote_serial | jq '.serialNumber'}"
不是有效的变量扩展。您可能想使用类似的东西
"$( printf '%s\n' "$remote_serial" | jq '.serialNumber' )"
但这假设$remote_serial
包含 JSON 文档的内容。
答案2
看起来应该是
"$(echo ${remote_serial} | jq '.serialNumber')"
代替
"${remote_serial | jq '.serialNumber'}"