【发布时间】:2019-05-06 12:01:45
【问题描述】:
在 bash 脚本中,我尝试将单引号和双引号的命令字符串附加到文件 (.profile)。
我想使用echo 然后>> 命令到.profile。当然,我愿意接受任何可行的解决方案。
我想使用的命令是 echo "curl -X POST -H "Content-Type: application/json" -d '{"value1":"PHONENUMBER","value2":"MESSAGE"}' https://maker.ifttt.com/trigger/TRIGGER/with/key/KEY &> /dev/null" >> .profile,但显然这在我的 bash 脚本中不起作用。
我不清楚printf %q 的工作原理,也不明白如何将其应用于我的问题。
我试过了
`CMDSTRING='curl -X POST -H "Content-Type: application/json" -d '`
`CMDSTRING=${CMDSTRING}"'"`
`CMDSTRING=${CMDSTRING}'{"value1":"+PHONENUMBER","value2":"MESSAGE"}'`
`CMDSTRING=${CMDSTRING}"'"`
`CMDSTRING=${CMDSTRING}' https://maker.ifttt.com/trigger/TRIGGER/with/key/KEY &> /dev/null'`
`echo $CMDSTRING`
【问题讨论】:
-
很高兴看到光明并以“正确”的方式去做。我以为这会又快又脏,但现在它变得缓慢、丑陋和痛苦。您建议哪种方法可行?
-
顺便说一句,如果您的消息来自不受信任的来源,使用
jq或其他 JSON 语法感知工具对其进行格式化以包含在内会更安全一些;这样,包含文字"的消息将不会逃避其引用并能够添加额外的有效负载参数。 (我不知道 IFTTT 的 API,但如果它支持回调,这些参数甚至可能是恶意的)。 -
re:编辑,请参阅BashPitfalls #14,了解为什么
echo $var总是有问题(需要echo "$var")。我希望反引号只是一个格式错误;你永远不会希望它们出现在你的实际代码中。 -
顺便说一句,还请注意,全大写变量名称位于 shell 和 POSIX 指定实用程序本身使用的命名空间中,而小写名称保留供应用程序使用并保证不会发生冲突。 (我们遇到很多有问题的人,因为他们运行
for PATH in ...,而for path in ...符合标准的建议并且不会无意中改变shell 的运行方式)。请参阅 pubs.opengroup.org/onlinepubs/9699919799/basedefs/…,记住 shell 和环境变量共享一个命名空间。 -
顺便说一句,还要注意
printf '%q'生成的代码对于bash 的评估是安全的,但对于所有符合POSIX 的shell来说不一定是安全的>。这使它成为在.bash_profile中生成内容的正确工具(如果您是 实际上使用了以前未知的值),但是.profile的错误工具(可以由bash 以外的shell 使用)。
标签: linux bash printf double-quotes single-quotes