(2021-08-11 初稿 - 2021-08-12 追記)
Bashスクリプトの関数や引数、ローカル変数、戻り値(返り値)、終了ステータス等のメモ。
Bashスクリプトの関数の定義
smp01() { # または function smp01(){ echo "Hello" } smp01 # => Hello
引数
引数は、関数側で $1 から順番に複数受け取ることができる。
smp02() { echo "Hello" $1. echo $2 } smp02 Hoge ”Nice to meet you." # => Hello Hoge. Nice to meet you.
ローカル変数
Bashスクリプトでは、変数が原則グローバルなので、関数内ではlocalコマンドで、積極的にローカル変数を用いる。
smp03() { local sum sum=$(($1+$2)) echo $sum } smp03 1 2 # => 3
終了ステータス
Bash関数のreturnは終了ステータスを返す。終了ステータスは0〜255の整数。
通常、0が正常終了
echo #? # => 直前のコマンドの終了ステータス
値を返す(戻り値)
値を返す場合は、以下の2つの方法がある。
1. グローバル変数に代入
関数の独立性が保てなくなるので、短いスクリプト以外では使いたくない。
2. 関数内で標準出力(echo)
関数内で標準出力したものは、呼び出し側の変数に関数の戻り値となり代入される。
smp04() { local sum sum=$(($1+$2)) echo $sum } total=$(smp04 1 2) # または ``(バッククォート) echo $total # => 3
複数の戻り値を返したい時は、echoを複数回実行する。
sum05() { echo "abc" echo 3.14 echo "def" } rtext=$(sum05) echo $rtext # => abc 3.14 def
上記のように、関数内で標準出力したものは、全て呼び出し側の変数に格納されてしまう点に注意。
また、それぞれの出力は、改行がスペースとなって連結される。
元のように改行して出力したい場合は、以下のようにする。
for str in $rtext; do echo $str done
最近筆者が覚えたsetコマンドを用いると、配列のように好きな部分を取り出せる。
(setコマンド便利!!)
set $rtext echo ${3} # => def # 戻り値は${1}から。 ${0}は実行コマンド
おわりに
Bashスクリプトは、慣れてくると短いコマンドで簡潔に記述できる点がすばらしい。
また、既存のLinuxコマンドを違和感なく使えるのもメリットだね。