curl コマンドの一部を変数に置き換える際にエラーが発生しました。

curl コマンドの一部を変数に置き換える際にエラーが発生しました。

カールコマンドを複数回実行するスクリプトを作成しています。カールコマンドはスクリプト全体で異なって使用され、何度も再利用されるコマンドの部分を置き換える変数を使用して(後でスクリプトをデバッグする必要があるとき)時間を節約したかったです。

curl -g -x "" -kカールコマンドを複数回使用しますが、他のスクリプトの例

# Usage 1
curl -g -x "" -k http://www.example.com/rest/v1/blah

# Usage 2
curl -g -x "" -k -i -X POST -H "Content-Type:application/json" -d "{'Username':'sally','Password':'password'}" http://www.example.com/rest/v1/blahblah

変数を使って上記のスクリプトを書き換えたいです。curl -g -x "" -k

# Snippet of curl command that will be used several times in script
curl_command="curl -g -x \"\" -k"

# Usage 1
$curl_command http://www.example.com/rest/v1/blah

# Usage 2
$curl_command -i -X POST -H "Content-Type:application/json" -d "{'Username':'sally','Password':'password'}" http://www.example.com/rest/v1/blahblah

書き換えられたスクリプトを実行するとエラーが発生します。

curl: (5) Could not resolve proxy: ""; Name or service not known

使用法 1 の場合、実行中として表示され、上記のcurl -g -x '""' -k http://www.example.com/rest/v1/blahエラーが発生します。curl_command="curl -g -x '' -k"実行時に変数を割り当て、中括弧{}で囲みようとしましたが、同様のエラーが発生しました。この記事を職場にどのように書きますか?

よろしくお願いします:)

答え1

基本的にあなたの質問はスペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?

外部引用符を書くと、$curl_command変数の値が取得され、curl_command各スペースシーケンスで別々の単語に分割されます。 (各単語はワイルドカードパターンとして解釈され、一致するファイル名のリスト(存在する場合)に置き換えられますが、あなたの場合はワイルドカードがないため、この段階では何​​も変更されません。)

引用符はシェル構文の一部です。引用符なしの変数拡張の影響を受けません。したがって、コマンドは$curl_commandパラメーターを使用して実行されます。curl-g-x""-k

文字列リスト(コマンドパラメータ)を文字列に入力しようとしています。それはうまくいきません。実際、何も空虚なことを言うことはできません。

強力な解決策は型変数を使用することです。文字列リスト文字列のリストを保存します。これをシェルでは配列といいます。 Bash、ksh、およびzshサポート配列:

curl_command=(curl -g -x "" -k)
"${curl_command[@]}" http://www.example.com/rest/v1/blah

この変数には、要素が、、空の文字列、およびcurl_command5つの要素配列が含まれています。curl-g-x-k

通常のshスクリプトが必要な場合は、他の操作を実行する必要がないと仮定して、位置パラメータを使用できます。

set -- curl -g -x "" -k
"$@" http://www.example.com/rest/v1/blah

別の可能性は、関数を使用して複数回使用されるコードをカプセル化することです。

curl_command () {
  curl -g -x "" -k "$@"
}
curl_command http://www.example.com/rest/v1/blah

関連情報