LoginSignup
14
7

More than 5 years have passed since last update.

使えるかもしれないbashのイディオム

Posted at

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
14
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
7