ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

シェルスクリプトの関数の戻り値について

はじめに

仕事で、バグがあったらしくシェルスクリプトのコードを見てくれないか、と頼まれたときの話。

対象のコード

for i in 'hoge'(hogeはfunction)

関数をforってどういうことやねん

動かしてみる

sw_versはMacのversionを出力するコマンドです。

#!/bin/bash

sw_vers

function find_mac_version {
  sw_vers
}

cnt=1

for i in `find_mac_version`
do
echo "cnt ${cnt}"
echo $i
cnt=`expr $cnt + 1`
done

結果

MacBook-Air:~ take$ ./func_return.sh 
ProductName:    Mac OS X
ProductVersion: 10.11.2
BuildVersion:   15C50
cnt 1
ProductName:
cnt 2
Mac
cnt 3
OS
cnt 4
X
cnt 5
ProductVersion:
cnt 6
10.11.2
cnt 7
BuildVersion:
cnt 8
15C50

なんてことない、シェルスクリプトの関数は、標準出力が戻り値のような扱いになるようで、これをforでスペース区切りで1つずつ取り出してるだけでした。

元々シェルスクリプトのreturnは終了コードの意味で、0から255までの値しか取らないそうです。

bokko.hatenablog.com

ちゃんとbashのコードを読んでいる姿勢、見習いたい。

まとめ

  • シェルスクリプトのreturnは0〜255までで、終了コードを意味する
  • 文字列を関数の返却値としたい場合はechoやprintfで標準出力したあと、変数に格納すれば良い
#!/bin/bash

function echo_hoge {
  echo 'hoge in function'
}

echo `echo_hoge` #=>hoge in function
  • forはinのあとの文字列を順番にi変数に格納するだけ(ごく普通の用法)
#!/bin/bash

for i in "hoge" "in" "function"
do
echo $i
done

出力

MacBook-Air:~ take$ ./func_return.sh 
hoge
in
function

上記を組み合わせるとこうなる。

#!/bin/bash

function hoge_in_function(){
  echo "hoge in function"
}

for i in `hoge_in_function`
do
echo $i
done

コードを読むだけじゃなくて、こんな風に実際に自分で動かしてまとめることでようやく身につくんだなぁと気づきました。