在 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`
最佳答案
使用 printf '%q'
生成 .profile
内容类似于以下内容:
{
printf '%q ' \
curl -X POST -H "Content-Type: application/json" \
-d '{"value1":"PHONENUMBER","value2":"MESSAGE"}' \
https://maker.ifttt.com/trigger/TRIGGER/with/key/KEY
printf '%s\n' "&>/dev/null"
} >> .profile
请注意,您不能使用 %q
如果需要,请格式化字符串 &>/dev/null
被解析为语法,因为就其本质而言,它会将传递的所有内容格式化为数据进行解析。
因此,我们使用 printf '%q ' "command name" "first argument" ...
对于实际命令本身,并在带外格式化重定向。
也就是说,请注意,只有当您从不受信任的来源替换变量(而不是像示例中那样对它们进行硬编码)并且担心无效值被滥用时,上面的内容才有值(value)用于命令注入(inject)。如果您真的只是将常量字符串附加到文件末尾,引用的 heredoc 将让您手动构建外观更自然的 shell 引用(实际上,正如您已经完成的那样!),并逐字传递它:
cat >>.profile <<'EOF'
curl -X POST -H "Content-Type: application/json" \
-d '{"value1":"PHONENUMBER","value2":"MESSAGE"}' \
https://maker.ifttt.com/trigger/TRIGGER/with/key/KEY &> /dev/null
EOF
在这里,<<'EOF'
之间的所有内容和 EOF
完全按照给定的方式传递,包括 shell 可能会尝试解释的引号和参数扩展。
关于linux - 使用 printf %q 使带引号的字符串可用作 shell 脚本输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56004803/