[ 岡山大学 | 理学部 | 地球科学科 | 地球および惑星大気科学研究室 ]

2019年度 大気科学演習1

シェルスクリプト

引数

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

条件によって処理を変える. シェルスクリプトは,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 で場合分けすることができる. 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




Last Updated: 2019/11/02, Since: 2019/10/24.
This page is generated by Makefile.rd2html.