在反引号内传递变量[重复]
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`
通常不是好的做法。最好使用mapfile
或read -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 "
【讨论】:
谢谢!是的,我现在开始工作了以上是关于在反引号内传递变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章
VSCode 自动完成和 IntelliSense 在反引号中不起作用
Newtonsoft.JSON 在反序列化数组中被双引号包围的对象时窒息