shメモ 
top

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}

imported