シェルスクリプトでかっこよく処理しようと思ったらつまづいた話
金曜から始めていろいろコケて困っていたけど今日解決した話です
先に言っておくと完全にしょーもないミスです
前提
会社から怒られない程度に現在やっているお仕事の内容をふんわり書いておくと、
IoT関連のインフラ基盤開発をやっています。
フェーズで言うと構築/運用/保守ですかね。
ごく最近(2ヶ月前)に唐突に配属が決まり、訳がわからないまま仕事が始まって、
今に至ります。
やろうとしたこと
コンテナにのせたAPIゲートウェイにcurlを投げて、DBからデータを取ってきて、
それをjson形式に変換!という作業をシェルスクリプトで書いて、実行しようとしました。
元々コマンドがドキュメントにずらずらと書いてあって、それを1行ずつ
ちまちま編集しながら投げていたのですが、
環境が代わるたびに同じ作業をやらなきゃいけないのが
めんどくさい&どうせなら勉強がてらシェルスクリプトで書いてみよう!
と思い至りちょちょっと調べて書いてみました。
以下がコード例です。
〜 #!/bin/sh curl http://$1.$2.info/hoge? -H "AdminToken:${3}" -o hoge.json curl http://$1.$2.info/huga? -H "AdminToken:${3}" -o fuga.json curl http://$1.$2.info/poke? -H "AdminToken:${3}" -o poke.json ... ... ... 〜
コマンドライン引数を使って、環境によってURLとAdminTokenが変更できるようにしました。
これで何回も同じようなコマンドを叩かなくて済む!と意気揚々と実行した結果、
やっぱり初回はうまく行きませんでした。
1回目のミスは…
- シングルクォートをダブルクォートに直すのを忘れてた
→シングルクォート内だと変数が変数として認識されないので、ダブルクォートで囲む必要があった
修正し、これでいけるだろ!と叩いてみるも、
また失敗。
今度はURLを間違えたかな?と思ってコンテナのyamlを見て、
routeとserviceがちゃんと設定されてることを確認。
そもそもcurl投げて応答があるかを確認したら、curlが帰ってこない。
確認したら、認証関連のミスでpodが立ってませんでした。てへぺろ
podもちゃんと立ったし、curlも通った!今度こそ!と思って実行してみると、
今度はちゃんとデータが取得できたっぽい。
…けど、jsonファイルの拡張子の後ろに?マークがついてる。
なんぞこれ?と思いながら中身を確認すると中身はおそらく大丈夫。
でも謎のエクスクラメーションマークが気になる。。
シェルスクリプトで実行することが原因なのかと思い、一つだけコマンドを抜き出して叩いてみると、
今度は普通に.jsonだけでファイルが取得できた。
??????と思いながらも、エクスクラメーションマークがついたファイルを削除しようとすると…
rmコマンド後の確認でエクスクラメーションマークが^Mと表示されているのに気付きました。
^Mってなんだよと思いながらググると、改行コードの話がずらっと出てきました。え?
もしやと思って編集していたサクラエディタの改行コードを見てみると、CRLFでした、、。
これがlinuxで化けて?になってたのね、、、
まとめ
いろいろつまづきましたが、めんどくさい取得処理を一気にできるようになりましたし、
シェルスクリプトを書く練習や改行コードの違いの勉強にもなったので結果オーライですね。
次はオプションとか使ってちゃんと文法チェックしていきたい。
おしまい