【发布时间】: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 的反馈