我想从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提示中输入的内容,该提示工作正常。造成差异的原因是什么?
答案 0 :(得分:0)
以下内容可行:
command=("curl" "http://localhost:59125/process"
"-d" "INPUT_TEXT=$sentence")
"${command[@]}"
这有两个变化:
我删除了$sentence
周围的错误引号,因为您不想向服务器发送引号(据我所见)。
我在"${command[@]}"
的使用周围加了双引号。如果没有双引号,数组的元素将与它们之间的空格连接,然后结果将被分词。使用双引号时,各个数组元素将用作单个单词。
第二点在bash FAQ中得到了很好的解释,还有一些SO答案处理引号。
要理解的重要一点是引号仅在解析命令时引用。作为变量中的字符的引用是只是一个字符;当变量的值扩展时,不会重新解释它。如果变量扩展不加引号,则变量中的空格用于分词;在定义变量的命令中引用空格的事实完全无关紧要。从这个意义上讲,bash与任何其他编程语言相同。