test -n
引数の文字列長がゼロのとき1を返す。それ以外の場合は0を返す。
test -n ''; echo $?
=> 1
test -n 'hello'; echo $?
=> 0
set -e
実行したコマンドが0以外の戻り値を返した場合、シェルスクリプトを終了する。
set -e
cmd_a
cmd_b
cmd_c
コマンドcmd_bが終了コード1を返した場合、cmd_cは実行される前にシェルスクリプトが終了する。エラーチェックを書かなくてよくなるが、エラーメッセージ表示などのエラーハンドリングはできない。
shift
コマンドライン引数を左向きにシフトする。先頭のやつは消えてしまう。
echo 'all $*:' $*
shift
echo 'all $*:' $*
実行結果
% sh ~/tz/sh/shift.sh a b c d e
all $*: a b c d e
all $*: b c d e
${parameter:=word}
これはShell Paramter Expansionで、:=を使うものは、パラメータparameterが設定されていない時にのみ、wordを値として設定するというもの。
${A:=hello}
の場合、シェル変数Aにhelloが入る。ただし、このとき、:=の右側に書かれたものは展開され実行されてしまう。helloコマンドがない場合にはエラーとなる。helloが実行されないようにするには:コマンドを使う。
: ${parameter:=word}
例
#!/bin/bash
: ${A:=hello}
echo $A
: ${A:=world}
echo $A
実行結果
hello
hello
最初の${A:=hello}では、Aに値が設定されていないので、helloが代入される。
2度目の${A:=world}ではAにhelloが入っているので何も起こらないため、echoコマンドの行では、そのままhelloが表示される。
:コマンド
:コマンドは、bashのビルトインコマンドの1つ。説明には、
Do nothing beyond expanding arguments and performing redirectoins. The return status is zero.
と書いてある。つまり、${parameter:=word}の場合のwordのようにコマンド実行をして欲しくない場合にこれを使えば良い。
: ${parameter:=word}