多字符串作为使用Bash的curl选项

时间:2015-04-22 05:04:20

标签: string bash curl

我想从HTTP服务器获取一些数据。它发送给我的内容取决于我在POST请求中的内容。

我在INPUT_TEXT字段中输入的是一系列单词。当我运行以下命令时,我看起来很好看。

$ curl http://localhost:59125/process -d INPUT_TEXT="here are some words"

我想要一个bash脚本将一些字符串作为命令行参数,并将其适当地传递给curl。我尝试的第一件事是将以下内容放在脚本中:

sentence=$1
command="curl http://localhost:59125/process -d INPUT_TEXT=\"${sentence}\""
$command
然后我按照这样运行脚本:

$ ./script "here are some words"

然后我为#34;","某些"和"字"中的每一个都收到卷曲Couldn't resolve host错误。看来"在这里"被正确地视为INPUT_TEXT,但其余的单词被认为是主机,而不是选项的一部分。

所以我试过了:

command=("curl" "http://localhost:59125/process" "-d" "INPUT_TEXT='$sentence'")
${command[@]}

我得到了与第一个脚本相同的输出。我终于得到了我想要的东西:

result=$(curl http://localhost:59125/process -d INPUT_TEXT="${sentence}")
echo $result

我仍然不确定这种区别是什么。在前两种情况下,当我回显命令的内容时,我得到了我从交互式Bash提示中输入的内容,该提示工作正常。造成差异的原因是什么?

1 个答案:

答案 0 :(得分:0)

以下内容可行:

command=("curl" "http://localhost:59125/process"
         "-d"  "INPUT_TEXT=$sentence")
"${command[@]}"

这有两个变化:

  • 我删除了$sentence周围的错误引号,因为您不想向服务器发送引号(据我所见)。

  • 我在"${command[@]}"的使用周围加了双引号。如果没有双引号,数组的元素将与它们之间的空格连接,然后结果将被分词。使用双引号时,各个数组元素将用作单个单词。

第二点在bash FAQ中得到了很好的解释,还有一些SO答案处理引号。

要理解的重要一点是引号仅在解析命令时引用。作为变量中的字符的引用是只是一个字符;当变量的值扩展时,不会重新解释它。如果变量扩展不加引号,则变量中的空格用于分词;在定义变量的命令中引用空格的事实完全无关紧要。从这个意义上讲,bash与任何其他编程语言相同。