変数を使用してカールコマンドを実行する

変数を使用してカールコマンドを実行する

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

userNamepassWordしかし、このように手動で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
}

関連情報