シェルプログラミングの学び直し
シェルスクリプトは何度か書いたことあるけど、
最初は知っている人に教えてもらって、あとはコマンド調べながら書いてかなり自己流に書いていた。
他人が書いたシェルスクリプトをあまり読まなかったし、体系的に学んだことがなかった。
仕事で扱う機会が増えたことと、他人が書いたシェルスクリプトを読んだことで、全然書き方知らないんだなぁと実感した。
とりあえず有名な書籍をググって本屋に行って「入門UNIXシェルプログラミング」を購入した。
初版は1999年、改訂第2版が出たのは2003年、2017年11月で24刷。定価3200円。技術書は高いね。
シェルプログラミングって、「プログラミング」だと考えて書くとうまくいかなくて
シェルコマンドの集まり。みたいな感じ。
今第3章まで読み進めている。よく知らないこと、なんとなく知っているけど使ってないことをメモっておく。
・シェルの種類
bash以外は存在しか知らなかった。それぞれ歴史があり特徴がある。
Bシェル:超シンプル。標準装備。対話に向かない。
Cシェル:Cっぽい書き方ができる。シェルスクリプトには向かない。
Kornシェル:BとCのいいとこ取り。記述形式はB。
tcshe:Cシェルの改良版。
・サブシェル
新しくシェルを起動するというのがイマイチ分かっていなかった。
ウィンドウやタブが視覚的に増えるわけじゃないからね。
シェルは新しいシェルを作ったとき、今の環境をその新しいシェルに全部引き継ぐ。新しいシェルでの変更はフィードバックしない。
丸括弧()でくくるとサブシェルを起動させる。
中括弧{}でくくるとカレントシェルで実行されるが、リダイレクト処理をしたときはサブシェルが起動される。
関数(関数名(){...})も中括弧と同じでリダイレクト処理の有無で変わる。
・コマンドセパレータ
改行、セミコロン、パイプは知ってる。ORとANDがプログラミングとして考えると違和感があった。
&:バックグラウンドで実行させる
||:OR制御演算子。左側のコマンドが失敗したときに右側のコマンドを実行する。
&&:AND制御演算子。左側のコマンドが成功したときだけ右側のコマンドを実行する。
・制御文
ifの条件の部分はどうしてもプログラミング的に考えてしまうけど、条件の部分にコマンドを記述し、終了ステータスが0だったらthenの中身を実行する。
よく鉤括弧[ ]で条件を書くけど、これはtestコマンドを書いている。
ここにgrepを書くことがあるけど、他にももっといろんなコマンド書いてもいいんじゃないかと思った。でも可読性を考えると$?でいいのかな。
そのほか、無限ループ(while : do~done)、case文のまたは(|)、改行のエスケープ(/)は、今まであまり使っていなかったので取り入れる。
変数展開は、ググると良質なまとめがある。文字列の切り出しとかに超便利。