Linux

シェルスクリプトから curl を使うときは eval を使おう

シェルスクリプトの中でcurlコマンドを使おうとしたときにハマったのでメモ。

現象

コマンドラインではこんな感じのリクエストを
curl --verbose --request POST http://example.com --header 'Content-Type: application/json' --data '{"hoge": "fuga"}'

シェルスクリプトからやろうとすると

curl.sh
!#/bin/sh

curl=`cat <<EOS
curl
 --verbose
 --request POST
 http://example.com
 --header 'Content-Type: application/json'
 --data '{"hoge": "fuga"}'
EOS`
${curl}

リクエスト時にヘッダーがContent-Type: application/x-www-from-urlencodedになってしまった。

文字列をコマンドとして実行するにはevalを使う

こうする

curl.sh
!#/bin/sh

curl=`cat <<EOS
curl
 --verbose
 --request POST
 http://example.com
 --header 'Content-Type: application/json'
 --data '{"hoge": "fuga"}'
EOS`
eval ${curl}

参照: http://linux.just4fun.biz/?%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A8%E3%81%97%E3%81%A6%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%83%BBeval%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89