Bashスクリプトの関数、引数、ローカル変数、戻り値について
(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コマンドを違和感なく使えるのもメリットだね。