bash script お気に入り小ネタ集
ホシイです。
Docker の利用シーンが増え、IaC の出番が増え、… で確実に増えたのが、shell script を書く時間です。以前はそんなに書いていなかったのでテキトーに済ませてきたのですが、調べるたびに便利な機能があるものですね。
bash script を書いていて、アレ、どうやって書くんだっけ… ということが非常によくあります。今回はそんな便利小ネタを (すぐに忘れてしまう自分の備忘のために) 書き出してみました。独断と偏見の、わたしのお気に入りセレクションで失礼いたします。
変数文字列から一部を取り出す
変数に file name が入っているが、その拡張子をはずしたいということがよくあります。
$ A=aa.tar.temp && echo ${A%.*}
aa.tar
${...}
の中で %
を使っているのが、変数値の右端から pattern match した部分を削除するという意味になっています。類似で %%
や #
##
などもあります。
変数値に文字列を足した文字列を追加する
file name に何かを足して cp したいみたいなこともよくあります。
$ cp temp.txt temp.txt.b
これは、以下のように短く書けます。
$ cp temp.txt{,.b}
これだけで、temp.txt.b
にコピーされます。同様に、,
の左右を入れ替えると逆 (末尾を削除) もできます。
ひとつ前のコマンド引数を再利用する
とにかく、おなじことを二度書くのがめんどうだったり、↑ ↑ とやって history に探し当てても file name などの直値が入っていると置き換えないといけなくて使いにくいことってありますよね。
$ mkdir -p temp/temp/temp
$ cd $_
$_
はひとつ前のコマンドの最後の引数をあらわします。これにより、mkdir した先に cd できます。
変数に default 値を設定する
script 実行時に外から環境変数で値を渡せるようにしつつ、必要ないときは default 値を使いたい。if
を使わずにできます。
#!/bin/bash
: "${CONFPATH:=/etc/xxxx}"
echo $CONFPATH
CONFPATH=/tmp ./test.sh
などのように呼び出しをすると、default 値を上書きできます。
類似で ${FOO:-val}
や ${FOO:+val}
もあります。
まとめ
script の世界は深く、書いてて気がつくとずいぶんと時間が経ってしまっていたりします。かなり複雑なことができる反面、機能不足と思うこともあり。追加の script runtime を入れなくてもよいという利便性は大きいので、なるべく bash で済ませてしまいたい!ということは多いです。あまりに凝ると可読性にも影響してしまいますので程度をわきまえつつ、コメントもちゃんと入れてメンテしやすい状態を保つように心がけたいところです。
参考
ここをひととおり眺めるだけでアイディアの助けになりそうです。