linux - 使用 printf %q 使带引号的字符串可用作 shell 脚本输入

标签 linux bash printf double-quotes single-quotes

在 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/

相关文章:

c - Linux内核中.mod.c文件中版本信息的含义

c - srandom_r 处的段错误

bash - 有什么办法可以下载 Facebook 群组吗?

c - 使用 fprintf 时,我在输出中得到镜像的字符数组

Java: token "}"上存在语法错误?

C++ 打印速度比 C 快得多

python - Python如何在远程机器上执行命令并等待执行完成?

linux - 命令 "+0800"中的 "stat"是什么意思?

linux - 对命令行中的列表感到困惑

bash - 如何用 BASH 中的递增数字替换所有匹配项?