func( ){
…
if [ … ] ; then
return 1 # 戻り値1
else
return 0 # 戻り値0
fi
}
func # 関数呼び出し
if [ $? -eq 0 ] ; then # 戻り値のテスト
…
fi
◆戻り値の使い方
・戻り値は、関数内での処理が正常に完了したかどうかを示すことができる。bashでは、testコマンドでTRUEと判定されるのは0の場合なので、正常終了の場合の戻り値を0と定義したほうがわかりやすいかも。関数のインターフェイス(引数や戻り値)は、コメントに明記したほうがよいだろうな。
. subfunc # 関数ファイルsubfuncの読み込み
func # 関数呼び出し
◆関数を別ファイルに定義すると良いこと
・関数だけを1つのファイルに定義しておけば、他のスクリプトで使う場合も、読み込むだけで使える。
・関数にバグがあったときも、関数ファイルだけ修正すれば、そのファイルを読み込んで使っているスクリプト全部のバグが解消できる。
・スクリプトのソースファイルの行数が減るので、読みやすくなる。
◆変数名は、全部大文字で定義するのが一般的らしい。環境変数と同じ名前を使わないように気をつけないとね。関数や変数の名前の付け方も、最初に決めておいたほうがいいかも。統一してあれば、デバッグやソースファイルを読むのが楽になる。
# 初期化
_PWCHAR=(0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u
v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)
# 参照
_CH=${_PWCHAR[10]} # 10番目の値を変数 _CH に取り出す
if [ "$ANSWER" -ge 1 ] ; then //数値として比較する
…
fi
expr "${ANSWER}" + 1 //計算する
◆値を数値としてテストする場合や計算したりする場合、変数に値が入っていない可能性がある場合は””で囲まないと値がないときエラーになる。
RNUM=$(echo $RANDOM) # 乱数取り出し
◆コマンドを実行するだけならそのまま記述すればよいが、コマンドの実行結果を参照する場合などにこれを使う。結果を変数に格納したり、コマンドの引数としてコマンドの結果を渡す場合など。
#
# f_readline - ファイルから1行読み込む関数
# 引数1 ファイル名
# 引数2 行番号
# 戻り値 0:正常読み込み 1:エラー _BUF:読み込みデータ
#
read_line() {
if [ $# -lt 2 ] ; then # 引数不足
return 1
fi
_CNT=1 # 行カウンタ
while read _BUF ; do
if [ $_CNT -eq $2 ] ; then # 行カウンタが引数2と同じになったら
return 0
fi
_CNT=$(expr $_CNT + 1) # 行カウンタにプラス1する
done < $1 # $1=ファイル名
NUM=1
for FN in *.bash ; do # カレントディレクトリの拡張子「bash」のファイル名を、変数FNに1つずつ格納してループ
FNLIST[${NUM}]=${FN} # ファイル名を配列変数FNLISTに格納
…
NUM=$(expr ${NUM} + 1) # カウンタにプラス1
done