1

我有一个调用“curl”来发布参数的 bash 脚本。其中一些参数的值中有空格,因此在将其传递给 curl 时,我们需要用引号将其括起来。否则,只有空格前的第一部分作为参数传递。

我尝试使用转义引号将命令存储在变量中,但我无法让它在命令替换中工作,除非使用 eval。我还可以通过直接在字符串上调用命令替换来使其工作(而不是将命令存储在变量中)。

是否可以将命令存储在变量中并在该变量上使用命令替换?这就是我在下面的代码中的尝试 1 中正在尝试并且失败的操作。我不明白为什么它不起作用:

#!/bin/bash

yesterday=$(date +"%Y-%m-%d %H:%M:%S" -d "1 day ago") #2013-09-04 01:15:51
now=$(date +"%Y-%m-%d %H:%M:%S" ) #2013-09-05 01:15:51
echo -e "INPUTS: Today: $now, Yesterday: $yesterday"

#Attempt 1: Does not work
cmd="curl -s -u scott:tiger -d url=http://localhost:8080 -d \"start=$yesterday\" -d \"end=$now\" -d \"async=y\" http://192.168.1.46:8080/cmd/doSendMinimalToServer"
output=$($cmd)
echo "Output from executing cmd variable: $output"
#Result: The quotes get passed into the HTTP POST request. This is not good.

#Attempt 2: Using eval on the variable. Works.
output_eval=$(eval $cmd)
echo "Output from eval'ing variable: $output_eval"
#Result: This works, but I would prefer not to use eval

#Attempt 3: Using Command substitution directly on the string. Works.
output_direct=$(curl -s -u scott:tiger -d url=http://localhost:8080 -d "start=$yesterday" -d "end=$now" -d "async=y" http://192.168.1.46:8080/cmd/doSendMinimalToServer)
echo "Output from executing string: $output_direct"
#Result: This works. The HTTP POST parameters correctly have spaces in their values and no quotes.

我也尝试过将参数作为数组传递,但未成功。

4

1 回答 1

2

将您的命令参数存储在一个数组中并像这样运行它:

#!/bin/bash

yesterday=$(date +"%Y-%m-%d %H:%M:%S" -d "1 day ago") # 2013-09-04 01:15:51
now=$(date +"%Y-%m-%d %H:%M:%S" ) #2013-09-05 01:15:51
echo -e "INPUTS: Today: $now, Yesterday: $yesterday"

cmd=(curl -s -u scott:tiger -d url=http://localhost:8080 -d "start=$yesterday" -d "end=$now" -d "async=y" "http://192.168.1.46:8080/cmd/doSendMinimalToServer")
output=$("${cmd[@]}")
echo "Output from executing cmd variable: $output"

我也认为你可以使用date '+%F %T'简单。

于 2013-09-05T09:02:08.847 回答