bashのシェルスクリプトで使えるかもしれないイディオムをまとめてみました
個人的には結構便利に使えています
bash以外のシェルでは動作確認してません
絶対パスの取得
realpathの代わりに
シンボリックリンクは展開されない点は注意
abs_path=$(cd $(dirname $my_path); echo $PWD/$(basename $my_path))
まとめてリダイレクト
サブシェルにすればまとめてリダイレクトできる
(
echo hoge
echo fuga
) >> log.txt
if
bashのifはコマンドのexit codeが0かそれ以外かで分岐する文
if [ "a" == "b" ]
は[
というコマンドに"a" == "b" ]
という引数を渡して実行してそのexit codeで分岐する
当然[
コマンド以外も渡せる
if diff -q a.txt b.txt > /dev/null ; then
echo a.txtとb.txtは同じ
else
echo a.txtとb.txtは違う
fi
ガード
ifでも出来るが1行でかけるのが魅力
test "$(id -u)" != "1" || echo user is root
test "$(id -u)" == "1" && echo user is root
3項演算子
他言語でいう a ? b : c
||
と&&
の組み合わせで実現できる
test "$(id -u)" == "1" && echo user is root || echo user is non-root
die
メッセージを表示してexitするだけのfunction
ガードとあわせるとエラーチェックがすっきりする
function die(){
echo $@ >&2
exit 1
}
test "$1" == "" && die 引数が指定されていません
test "$(id -u)" != "1" && die rootで実行してください
split
setコマンドを使って位置パラメータに代入(上書きされるので注意)
line="a b c"
set $line
echo $1 # a
echo $2 # b
echo $3 # c
self-documentation
自分自身のコメント行をgrepしてドキュメントやヘルプにする
定義と実装が近くなるのがよい気がする
Makefileとかでよく使ってました
# @doc hoge [-abcd] <file>
function __hoge(){
echo do hogehoge
}
# @doc fuga [-xyz]
function __hoge(){
echo do fugafuga
}
# @doc help
function __help(){
echo usage:
grep -e '^# @doc' $0 | cut -c7- | xargs -i echo $(basename $0) {}
}
cmd=$1
shift
case $cmd in
hoge) __hoge $@ ;;
fuga) __fuga $@ ;;
help) __help $@ ;;
esac
trap
trapを使うとシグナルを受信したときや終了時にコマンドを実行できる
finally
的に使える
SSHのセッションが切れてHUPしたときやCtrl-C
で終了された場合も実行されるので安心
function __clean(){
# 後処理(一時ファイルの削除など)
}
trap __clean EXIT INT QUIT TERM HUP