web-dev-qa-db-ja.com

Bash:evalなしで変数からコマンドを実行します

指定された引数から構成される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が返されます。これは、誤って作成されたデータパラメータを示しています。

誰かが私に、コマンドをサブシェルに直接渡すことができるようにコマンドを構築する方法を説明できますか?

2
Jonas

ピエールに感謝します。

どの種類の引用符をどこに配置するかについて試行錯誤を繰り返した後、私はついにこれを機能させました:

$(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\""}")
0
Jonas

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\"}'")

ネストは大多数のシェルでサポートされており、バックティックよりも読みやすくなっています。

3