私の考えには非常に簡単だと思われるスクリプトがあります。
#!/bin/sh
URL=myserver:9443
myCmd="curl -sS -k -X 'POST' 'https://"
myCmd+=$URL
myCmd+="/SKLM/rest/v1/ckms/accessToken' "
myCmd+="-H 'accept: application/json' "
myCmd+="-H 'Accept-Language: en' "
myCmd+="-H 'Content-Type: application/json' "
myCmd+="-d '{ \"userid\": \"SKLMAdmin\", \"password\": \"XXX\" }'"
echo $myCmd
authTok=$($myCmd)
実行すると、次の結果が表示されます。
curl -sS -k -X 'POST' 'https://myserver:9443/SKLM/rest/v1/ckms/accessToken' -H 'accept: application/json' -H 'Accept-Language: en' -H 'Content-Type: application/json' -d '{ "userid": "SKLMAdmin", "password": "XXX" }'
curl: (3) URL using bad/illegal format or missing URL
curl: (6) Could not resolve host: application
curl: (6) Could not resolve host: en'
curl: (6) Could not resolve host: application
curl: (3) URL using bad/illegal format or missing URL
curl: (6) Could not resolve host: "SKLMAdmin",
curl: (3) URL using bad/illegal format or missing URL
curl: (6) Could not resolve host: "XXX"
curl: (3) unmatched close brace/bracket in URL position 1:
}'
エコー出力をカットしてシェルに貼り付けると、コマンドは正常に機能しますが、スクリプト内でそれを実行する行にこの文字列エラーが発生します。
スクリプトでcURLを使用するためのいくつかの基本的な規則に違反していると思いますが、それを理解できないようです。 URLを変数(最終的にはユーザー名とパスワード)にする必要がありますが、それは問題のようです。
答え1
私は質問にbashでタグ付けしたので、bashを使用できるとします。この場合、しなければならないbashは配列をサポートしていますので使用してください。配列は、コマンド/コマンドパラメータを保存するためのより良い選択です。
#!/usr/bin/env bash
url=myserver:9443
uri='/SKLM/rest/v1/ckms/accessToken'
#data='{ \"userid\": \"SKLMAdmin\", \"password\": \"XXX\" }'
data=$(jo userid=SKLMAdmin password=XXX)
opts=(
-sSk
-X POST
-H 'accept: application/json'
-H 'Accept-Language: en'
-H 'Content-Type: application/json'
-d "$data"
)
authtok=$(curl "${opts[@]}" "${url}${uri}")
この配列を使用すると、個々のオプションを個別に拡張できますが、個々に参照されているように、単語の分離やその他の不要な拡張を防ぐことができます。
"${opts[@]}"
次に拡張予定:
'-sSk' '-H' 'accept: application/json' '-H' 'Accept-Language: en' '-H' 'Content-Type: application/json' '-d' '{ \"userid\": \"SKLMAdmin\", \"password\": \"XXX\" }'