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