スクリプトを実行するときに値を渡すことができる. スクリプトに渡す値は引数(ひきすう)と呼ばれる. 引数を参照するときは,$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