在反引号内传递变量[重复]

Posted

技术标签:

【中文标题】在反引号内传递变量[重复]【英文标题】:Passing variable inside backticks [duplicate] 【发布时间】:2018-01-17 13:58:20 【问题描述】:

这是我遇到问题的一些代码

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

我无法在反引号内传递变量 $servername。对服务器名称进行硬编码绝对可以正常工作

我正在使用 bash 脚本。试图逃跑,但它不起作用。我知道我遗漏了一些非常微不足道的东西,但我并没有意识到。

【问题讨论】:

顺便说一句,for i in `echo $id` 通常不是好的做法。最好使用mapfileread -a 将结果直接读入数组变量(而不是字符串);这样您就不会出现意外行为,例如全局扩展或在不需要的分隔符上拆分字符串。 并且变量应该使用--arg 传递给jq,而不是将字符串替换为稍后解析的 JSON —— 否则会导致注入攻击和格式错误的内容(如果字符串包含需要被转义)。 顺便说一句,你的直接问题是shellcheck.net 会发现的。 (另外,使用$()而不是反引号——这两种形式都符合POSIX标准,但是反引号会改变正在运行的命令中反斜杠和其他反引号的行为,使它们容易产生副作用和特别难筑巢)。 感谢@CharlesDuffy 的反馈 【参考方案1】:

反引号不是问题——这是因为变量出现在单引号内。这样做:

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 "

【讨论】:

谢谢!是的,我现在开始工作了

以上是关于在反引号内传递变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

bash pipestatus 在反引号命令中?

VSCode 自动完成和 IntelliSense 在反引号中不起作用

Newtonsoft.JSON 在反序列化数组中被双引号包围的对象时窒息

使用 AngularJS 的 typescript 时如何在反引号中获取 html/css snipits

实例成员:计算属性 监听属性以及vue的项目开发

shell中单引号双引号反斜杠简说