Linuxスクリプトでカールを使用する際に問題があります。
#!/bin/bash ユーザー名= "ユーザー"; パスワード="パスワード"; TenantName = "テナント"; commande="curl -X POST -H \"コンテンツタイプ: アプリケーション/json\" -H \"キャッシュ制御: キャッシュなし\" -H 「郵便局トークン: 111131da-8254-21b3-1b95-9c12954152c9」 -d '{\"auth\":{\"tenantName\":\"$tenantName\",\"passwordCredentials\": {\"ユーザー名\":\"$userName\",\"パスワード\":\"$passWord\"}}}' \"http://controller:5000/v2.0/tokens\""
commande変数の出力をシェルにコピーして貼り付けるとうまくいきますが、次のように使用すると:
res= $(評価 $コマンド) #or res=`$commande`
これらのコマンドのどれも機能しません。これは通常発生する出力エラーです。
行11: {"access":: コマンドが見つかりません
PS:私がそうするなら
エコ$コマンド
その後、結果をシェルにコピーして機能しました。誰でも私を助けることができればいいでしょう!
答え1
変数はコード用ではなくデータ用です。関数を定義します。これはまたあなたの提案を簡素化します。
#!/bin/bash
userName="user"
passWord="password"
tenantName="tenant"
commande () {
curl -X POST \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Postman-Token: ..." \
-d@- \
http://controller:5000/v2.0/tokens <<EOF
{
"auth": {
"tenantName": "$tenantName",
"passwordCredentials": {
"username": "$userName",
"password": "$password"
}
}
}
EOF
}
上記は引用をより簡単にするために文字列に含めるのではなく、ここのドキュメントからJSONを読みます(標準入力から@-
オプション引数を読む)。-d
userName
passWord
しかし、このように手動でJSONをエンコードすることも、およびの値がJSONで正しくエンコードされていることを確認できない場合はtennatnName
悪い考えです。より良い解決策は、このようなものを使用してjq
正しいJSONを生成することです。
commande () {
json_template='{
auth: {
tenantName: $tn,
passwordCredentials: {
username: $un,
password: $pw
}
}
}'
jq -n --arg un "$userName" \
--arg pw "$passWord" \
--arg tn "$tenantName" "$json_template" |
curl -X POST
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Postman-Token: ..." \
-d@- \
http://controller:5000/v2.0/tokens
}