8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Shell ScriptAdvent Calendar 2016

Day 10

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

Posted at

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

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

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?