ShellScript
Bash
sh
シェルスクリプト

カッコつけないシェル関数定義

More than 1 year has passed since last update.

 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では複合コマンドを指定することになっていますね。

 以上、知っていても雑談ネタにしかならないだろうムダ知識でした。