Shell Script Advent Calendar 2016にコネタを書きます。
シェル関数の定義というと、こんな構文のイメージかと思います。
foo () {
……
}
ちなみに、bashやzshなどいくつかのシェルでは、頭にfunction
を付けられたり、そのかわりに()
を省略できたりしますが、そこは今回の本質ではないので省略します。
さて、この{ … }
は、実は{ echo pen; echo pineapple; } > pp.txt
のように書くときの{ … }
と同じです。
かわりに算術式評価(( … ))
を指定してみましょう。算術式評価はbash、ksh、zshで使えます。
countup () ((
count++
))
実行してみます。
$ count=1
$ countup
$ echo $count
2
想定した動作になっているようです。
次にif文を指定してみましょう。ファイルが存在したら「exist」を、存在しなければ「not exist」を出力する関数はこんな感じで書けます。
is_exist () if [ -e "$1" ]; then
echo exist
else
echo not exist
fi
for文やwhile文を指定する手もありますね。
echoargs () for x; do
echo "$x"
done
なお、単一コマンドを指定できるかどうかはシェルによって違うようです。たとえば次の例は、筆者のところでは、dashとzshでは定義できましたが、bashでは文法エラーになりました。
sayhello () echo hello
dashのmanpageを見ると、シェル関数定義の構文は次のように書かれています。
The syntax of a function definition is
name () command
bashのmanpageでは次のように書かれています。
Shell functions are declared as follows:
name () compound-command [redirection]
bashでは複合コマンドを指定することになっていますね。
以上、知っていても雑談ネタにしかならないだろうムダ知識でした。