Bash 在backticks中传递变量

Bash 在backticks中传递变量,bash,jq,Bash,Jq,下面是一些我遇到问题的代码 id=`my_api myrouter myroutername getsomething'{"uid":"$servername","meta_type":"system"}'| $SCRIPTS_DIR/jq -M '.result.data[].uid'` for i in `echo $id`; do echo $i echo "" done 我无法在backticks中传递变量$servername。对服务器名进行硬编码绝对可以 我使用

下面是一些我遇到问题的代码

id=`my_api myrouter myroutername getsomething'{"uid":"$servername","meta_type":"system"}'| $SCRIPTS_DIR/jq -M '.result.data[].uid'`

for i in `echo $id`;
do

    echo $i
    echo ""
done
我无法在backticks中传递变量$servername。对服务器名进行硬编码绝对可以


我使用的是bash脚本。试图逃跑,但没用。我知道我遗漏了一些非常琐碎的东西,但我没有意识到这一点。

倒勾不是问题所在,因为变量出现在单引号内。这样做:

id=$(my_api myrouter myroutername getsomething'{"uid":"'"$servername"'","meta_type":"system"}'| $SCRIPTS_DIR/jq -M '.result.data[].uid')
# ............................................a........b^^^^^^^^^^^^^c.......................d

因此,单引号字符串从“a”开始,以“b”结束,变量用双引号替换以扩展字符串,然后单引号字符串的其余部分从“c”转到“d”

,因为“echo$id”中的i通常不是好的做法。最好使用
mapfile
read-a
直接将结果读入数组变量(而不是字符串);这样,您就不会出现意外行为,例如在不需要的分隔符上进行全局扩展或字符串拆分。变量应该使用
--arg
传递到
jq
,而不是在以后解析JSON时进行字符串替换--否则会导致注入攻击和格式错误的内容(如果字符串包含需要转义的内容)。顺便说一句,您的直接问题是会被捕获。(另外,请使用
$()
而不是反勾号——这两种形式都与POSIX兼容,但反勾号会改变正在运行的命令中反勾号和其他反勾号的行为,使它们容易产生副作用,尤其难以嵌套)。谢谢@CharlesDuffy的反馈谢谢!是的,我现在可以工作了