スクリプトを実行するときに値を渡すことができる. スクリプトに渡す値は引数(ひきすう)と呼ばれる. 引数を参照するときは,$1, $2, $3, ... のように参照する.
まずはやってみる. 以下の内容を書き込んだファイル arg.sh を作成する.
#!/bin/bash echo $1 echo $2 echo $3
実行許可を出す.
$ chmod u+x arg.sh
引数を適当に与えて実行してみる.
$ ./arg.sh apple banana cherry apple banana cherry
引数を変えて実行してみる.
$ ./arg.sh apple apple
この例では,引数を1個しか与えていないので,$2 と $3 は空っぽになり,空行が出力される.
あと,$# で引数の数を,$@ は全ての引数を,それぞれ参照することができる. arg.sh を少し書き換えて
#!/bin/bash echo $# echo $@
いろんな引数を与えて実行してみる.
引数の数を使って無駄な表示をしないようにする.
#!/bin/bash i=1 while [ $i -le $# ]; do echo I like $( eval echo '$'{$i} ) i=$(( i + 1 )) done
これを実行すると
$ ./arg.sh apple banana cherry I like apple I like banana I like cherry $ ./arg.sh apple I like apple $ ./arg.sh apple banana I like apple I like banana
ここでは入れ子になった変数 '$'{$i} を使っている. 入れ子になった変数を使うときは eval コマンドを使う(とりあえず詳細は知らなくてもよい). i=1 のとき,eval echo '$'{$i} で,echo $1 が実行される.
条件によって処理を変える. シェルスクリプトは,if で始まって fi で終わる. [ の後ろと ] の前には空白を入れる.
条件に合致したら何かする(if0.sh).
#!/bin/bash if [ $1 = Raspberry ]; then echo Pi fi
実行
$ ./if0.sh Apple $ ./if0.sh Raspberry Pi
条件に合致した場合としない場合で処理を分ける(if1.sh).
#!/bin/bash if [ $1 = $2 ]; then echo same else echo different fi
実行
$ ./if1.sh apple banana different $ ./if1.sh cherry cherry same
分けたものをさらに分ける(if2.sh).
#!/bin/bash if [ $1 -gt $2 ]; then echo $1 '>' $2 elif [ $1 -eq $2 ]; then echo $1 '=' $2 else echo $1 '<' $2 fi
数字を2つ読み込んで,四則演算するスクリプト
#!/bin/bash if [ $# -ne 2 ]; then echo invalid input exit fi echo $(( $1 + $2 )) echo $(( $1 - $2 )) echo $(( $1 * $2 )) echo $(( $1 / $2 ))
exit は終了の合図. 上のスクリプトの場合,引数の数が2でない場合,invalid input と表示して終了する. 引数の数が2のときは,加減乗除の計算をおこなってその結果を表示する.
case で場合分けすることができる. case で始まって,esac で閉じる.
#!/bin/bash case $# in 0) echo I do not have a favorite thing. ;; 1) echo My favorite thing is ${1}. ;; 2) echo My favorite things are ${1} and ${2}. ;; *) echo I have a lot of favorite things. ;; esac
最後の選択肢 * はワイルドカード.
ちなみに,このスクリプトは case の中を逆順に並べると機能しない.
#!/bin/bash case $# in *) echo I have a lot of favorite things. ;; 2) echo My favorite things are ${1} and ${2}. ;; 1) echo My favorite thing is ${1}. ;; 0) echo I do not have a favorite thing. ;; esac
何を入力しても出力は同じになる. 理由はわかりますよね?
read は入力されたものを読み込んで変数に格納する.
#!/bin/bash echo Enter your name read name echo Hello $name
最初に echo コマンドが実行されて Enter your name と表示される. 次に read コマンドが実行されると,入力待ちの状態になる. キーボードから入力して Enter キーを押すと,入力したものが変数 name に代入される. 最後に echo コマンドで,Hello と変数 name に代入された値が表示される.
ファイルの中身を1行ずつ読み込む(readfile.sh)
#!/bin/bash while read line; do echo $line done < $1
fruits.txt というファイルをつくって,試してみる.
$ cat fruits.txt apple banana cherry $ ./readfile.sh fruits.txt apple banana cherry