

複数のエンドポイントに対して

[code]

    curl https://endpoint -d param1=correct -o /dev/null -w %{http_code}
    curl https://endpoint -d param1=wrong -o /dev/null -w %{http_code}
    curl https://endpoint -d param1= -o /dev/null -w %{http_code}
    
[/code]

のように1つのパラメータを変えて各結果が 200 404 400 になることをバリデーションするようなスクリプトを作りたいです

そのために  
**ターミナルに貼り付けて動く複数行のコマンドをそのままソースコードに貼り付けて  
１度文字列として変数に入れた後に変数を展開して実行したいです**

[code]

    ENDPOINT=$(cat <<EOS
    curl https://endpoint1 \
    -d param2=abc
    )
    
    echo $ENDPOINT
    
    RESULT=$(${ENDPOINT} -d param1=correct -o /dev/null -w %{http_code})
    
    echo $RESULT
    
[/code]

のように書いてみたんですが RESULT が 200 になるべきコマンドを入れても 400 エラーになってしまいます  
$ENDPOINT の中身は正しくセットできていて出力結果をターミナルにコピペして実行すると 200 になります

`VAR=$(コマンド文字列)`  
で標準出力を変数に格納できると思うのですがコマンド文字列の中に変数を使うことはできないんでしょうか

文字列の中身をコマンドとして実行してその標準出力をシェル変数で取得するにはどう書けばいいのでしょうか

* * *

[ヒアドキュメントで指定した改行を含むコマンド文字列を実行したい](https://ja.stackoverflow.com/questions/63602/%e3%83%92%e3%82%a2%e3%83%89%e3%82%ad%e3%83%a5%e3%83%a1%e3%83%b3%e3%83%88%e3%81%a7%e6%8c%87%e5%ae%9a%e3%81%97%e3%81%9f%e6%94%b9%e8%a1%8c%e3%82%92%e5%90%ab%e3%82%80%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e5%ae%9f%e8%a1%8c%e3%81%97%e3%81%9f%e3%81%84)

こちらで似たような質問をして文字列を変数化するんじゃなく  
関数化してはどうですかと回答をいただいたんですが

param1 というのはレコードIDで大半のエンドポイントに共通で必要になるパラメータで  
複数のエンドポイントで同じバリデーションを繰り返したいので  
パラメータ化するのはエンドポイントの方にしたいのです

まだ上の内容が実行すらできてないのでこの先正しくかけているかわからないんですが  
最終的に以下のような感じに書きたいです

[code]

    # エンドポイント(と個別パラメータ)を引数で受け取って 3 パターンのバリデーションを行う関数
    
    validate_param1()
    {
    # 正しい => 200 OK
      RESULT=$($@ -d param1=correct -o /dev/null -w %{http_code})
      if [ "$RESULT" != '200' ]; then echo  "failed at Line $LINENO"; exit; fi
    
    # 存在しない => 404 Not Found
      RESULT=$($@ -d param1=wrong -o /dev/null -w %{http_code})
      if [ "$RESULT" != '404' ]; then echo  "failed at Line $LINENO"; exit; fi
    
    # 空 => 400 Invalid Request
      RESULT=$($@ -d param1= -o /dev/null -w %{http_code})
      if [ "$RESULT" != '400' ]; then echo  "failed at Line $LINENO"; exit; fi 
    }
    
    # 各エンドポイントに個別パラメータを指定してバリデーションを適用する
    
    ENDPOINT=$(cat <<EOS
    curl https://endpoint1 \
    -d param2=abc
    )
    validate_param1 $ENDPOINT
    
    ENDPOINT=$(cat <<EOS
    curl https://endpoint2 \
    -d param3=def
    )
    validate_param1 $ENDPOINT
    
    ENDPOINT=$(cat <<EOS
    curl https://endpoint3 \
    -d param4=ghi
    )
    validate_param1 $ENDPOINT
    
      :
    
[/code]

もしもっとうまく書く方法があったら教えていただけるとありがたいです

* * *

ようやく原因はわかりました

[code]

    COMMAND=$(cat <<EOS
    curl -s https://httpbin.org/post \
    -d param='{"x":1}'
    EOS)
    
    echo $COMMAND # 上の文字列が表示される
    RESULT=$($COMMAND)
    echo $RESULT
    
    # 表示された文字列をそのまま $() の中に書いたもの
    RESULT=$(curl -s https://httpbin.org/post -d param='{"x":1}')
    echo $RESULT
    
[/code]

こういうテストコードを書いてみると

[code]

    curl -s https://httpbin.org/post -d param='{"x":1}'
    { "args": {}, "data": "", "files": {}, "form": { "param": "'{\"x\":1}'" }, "headers": { "Accept": "*/*", "Content-Length": "15", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "curl/7.64.1", "X-Amzn-Trace-Id": "Root=1-5e681d1c-980920a82239923c1a3bd596" }, "json": null, "origin": "164.70.253.210", "url": "https://httpbin.org/post" }
    { "args": {}, "data": "", "files": {}, "form": { "param": "{\"x\":1}" }, "headers": { "Accept": "*/*", "Content-Length": "13", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "curl/7.64.1", "X-Amzn-Trace-Id": "Root=1-5e681d1d-21605a46dca0cbf3d3679611" }, "json": null, "origin": "164.70.253.210", "url": "https://httpbin.org/post" }
    
[/code]

となって正しく貼り付けて動く方で  
`"param": "{\"x\":1}"`  
となるべきPOSTパラメーターが  
`"param": "'{\"x\":1}'"`  
と ' が含まれてしまっていました

ただどう直したらいいかがわかりません

ヒアドキュメントにターミナルに貼り付けて動く文字列をそのまま記述して  
１度変数に文字列として格納して実行するというのは無理なんでしょうか…


CC BY-SA 4.0
2020-03-10T10:22:01.990
63735
2020-03-11T05:43:48.173
2020-03-11T05:43:48.173
question
bash
変数に入っている文字列をシェルコマンドとして実行する方法


変数の値を参照して `curl` コマンドを実行しつつ、結果のステータスコードを変数に代入する実行例です。

[code]

    $ export SOja="https://ja.stackoverflow.com"
    $ status_code=`curl -o /dev/null -w '%{http_code}\n' -s ${SOja}`
    $ echo $status_code
    200
    
[/code]


CC BY-SA 4.0
2020-03-10T12:07:00.807
63739
2020-03-10T12:07:00.807
3060
63735
answer