为什么命令替换不起作用?

时间:2013-09-05 08:26:18

标签: bash variables substitution

我有一个bash脚本调用“curl”来发布参数。其中一些参数的值有空格,因此我们需要在将其传递给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.

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

1 个答案:

答案 0 :(得分: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'来简化。