🐚

bash で script 書くときに気をつけたいことと備忘録

2022/08/30に公開

bash で久しぶりに真面目にスクリプトを書こうとしたときに、ありとあらゆる全てのことを忘れていました。そこで、ありとあらゆるサイトを参考に bash のやりなおしをしました。更にいうと、新たな手法にもチャレンジしました。その軌跡をここに記しておきます。

BDD

bash script でテスト駆動なんて、と思っていましたが、BDD までできる世の中になっていました。

初めての TDD がRSpec: Behaviour Driven Development for Rubyだったので、ちょうどよかったです。というか、もしかしたら TDD はあまり経験がなくて、BDD ばっかりかもしれません。

shellspec/shellspec: A full-featured BDD unit testing framework for bash, ksh, zsh, dash and all POSIX shells
ShellSpec - シェルスクリプト用のフル機能のBDDユニットテストフレームワーク - Qiita
ShellSpec を使って、テスト駆動でシェルスクリプトを書いてみる

なお、実際のcurlコールアウト部分は、Swagger でモック立てました。やりすぎか。

API Documentation & Design Tools for Teams | Swagger

命名規則

たまに真面目にプログラム作ろうとすると、思ったよりクラス名やメソッド名にハマります。setgetでごまかすのは良くないですね。ちゃんとしよう。bash の script の場合、特にクラス名に悩むことはないですが、クラス程度のスコープでファイルを区切ったので、ファイル名の命名規則として参考にしたりしています。

うまくクラス名を付けるための参考情報 - Qiita
関数名によく使われる英単語(動詞)の意味とニュアンス | PHP Archive

bash scripts - best practicies

ほぼ本題。「えっ、そんなことするんだ」みたいな書き方が多く、とても学びの多い1週間でした。

styleguide | Style guides for Google-originated open-source projects
Best Practices for Writing Bash Scripts | by Mohit Sharma | FAUN Publication
移植性・可搬性の高いシェルスクリプトを書くための技術まとめ - Qiita
シェルスクリプトを高級言語のような書き味に近づける Tips 集
bashスクリプティング研修の資料を公開します - エムスリーテックブログ
bashスクリプトの最初の方に書いておくと少しだけ安心できる数行のコード - Qiita

bash shell 引数

$0, $1... あたりは覚えてんだけどね。

シェルの引数あれこれ - はい!今やってます!

bash script の実行形態で処理の有無を見分ける方法
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
  <処理>
fi

シェルスクリプトで自身のファイル名を取得 | ハックノート

bash エラー処理まわり

TRAP しておいたり、エラー中断した場合の対応

シェルスクリプトでset -eしているときに処理を中断せずエラーを扱う方法
シェル、シェルスクリプトの使い方まとめ - ぺい

bash で ERR を stacktrace したいとき
bash stacktrace
bashのtrap(ERR)が関数内に継承されないわけがない - Qiita
Bashで自身の関数名と呼び出し元の関数名を取得する - Qiita

bash でループ

なんだろう。常に忘れてしまう。

ShellScript (Bash) よく使うループ文 まとめ | tyablog.net
Bashでいろいろループする - Qiita
bash: readとパイプと環境変数 | Webシステム開発/教育ソリューションのタイムインターメディア
read:標準入力から変数へ代入する10事例!意外な例も?
bashでjqを使ってJSONの配列をループさせる - Qiita

bash で test するとき

[test と [ と [ コマンドの違い - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog
シェルスクリプト(bash)のif文やwhile文で使う演算子について - Qiita
Bashのif文でANDやOR条件、&&や||演算子を使う | 晴耕雨読
シェルで変数の空文字判定 | ハックノート

関数関係

実行ファイルの有無で判断する処理を case で増やしたくなかったのと、そこは関数で呼ぶでしょみたいなときに。

bashでfunctionが存在するかしらべる - 株式会社BEFOOL ブログ

一応、ファイルの場合

Bash Shell Script - ファイルが存在することを確認

共通関数は外部ファイルにまとめるよね

シェルスクリプトで共通関数を外部ファイルに定義して使う方法これだけ! | beyondDays

共通変数(関数じゃないな)

シェルスクリプトで外部ファイルに記述された変数を利用する方法 | 俺的備忘録 〜なんかいろいろ〜

ファイルの拡張子まわり

macOS の find コマンドで正規表現を使い、複数の拡張子を検索する - Qiita
bashの変数展開によるファイル名や拡張子の取得 - Qiita

mac 固有

Macのシェルスクリプト内で echo -n しても改行が抑制されない件 | てきとーなブログ

Discussion