指定された引数から構成されるcurl
コマンドを実行する必要があるスクリプトに問題があります。サブシェルでeval
を使用すると機能しますが、 this によると、スタイルが悪いように思われるため、これは避けたいと思います。
スクリプトの関連部分は次のとおりです。
_#!/bin/bash
COMMAND="curl -s -o /dev/null -w '%{http_code}' -X POST -H \"Content-Type:application/json\" -H \"Accept:application/json\" https://www.example.com/login -d '{\"username\":\"$1\",\"password\":\"$2\"}'"
echo $(eval $COMMAND)
_
Evalを使用すると、指定された資格情報の有効性に応じて、期待どおりに201または401を取得します。 evalを削除してecho $($COMMAND)
を使用すると、400が返されます。これは、誤って作成されたデータパラメータを示しています。
誰かが私に、コマンドをサブシェルに直接渡すことができるようにコマンドを構築する方法を説明できますか?
ピエールに感謝します。
どの種類の引用符をどこに配置するかについて試行錯誤を繰り返した後、私はついにこれを機能させました:
$(curl -s -o /dev/null -w '%{http_code}' -X POST -H "Content-Type:application/json" -H "Accept:application/json" https://example.com/login -d "{\"username\":"\"$1\"",\"password\":"\"$2\""}")
Evalの使用を避けるために、バッククォートまたはネストを使用できます。
バッククォート
$ var=\`curl -s -o /dev/null -w '%{http_code}' -X POST -H \"Content-Type:application/json\" -H \"Accept:application/json\" https://www.example.com/login -d '{\"username\":\"$1\",\"password\":\"$2\"}'"\`
ネスティング
$ var = $(curl -s -o /dev/null -w '%{http_code}' -X POST -H \"Content-Type:application/json\" -H \"Accept:application/json\" https://www.example.com/login -d '{\"username\":\"$1\",\"password\":\"$2\"}'")
ネストは大多数のシェルでサポートされており、バックティックよりも読みやすくなっています。