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