ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

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コマンドを違和感なく使えるのもメリットだね。

関連ページ