はじめに
仕事で、バグがあったらしくシェルスクリプトのコードを見てくれないか、と頼まれたときの話。
対象のコード
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までの値しか取らないそうです。
ちゃんと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
コードを読むだけじゃなくて、こんな風に実際に自分で動かしてまとめることでようやく身につくんだなぁと気づきました。