シェルスクリプトとは
スクリプト(特定の処理を行うために作成したプログラム)をシェルプログラムで記述したもの。このシェルスクリプトを使用することで一連のコマンドライン作業を自動化することもできる。シェルスクリプトを記述するためには1行目に実行するシェルを宣言する。
# !/bin/bash
実行コマンド(4種類)
# sourceコマンド
$ source testing.sh
# bashコマンド
$ bash testing.sh
# コマンドは省略してスクリプトファイルの前に「 . 」と入力してスクリプトを実行することも可能
$ . testing.sh
# シェルスクリプトファイルに実行権を与えた場合は、ファイル名を入力するだけで実行可能
$ ./testing.sh
シェルスクリプトの特殊変数理解
| 変数名 | 説明 |
|---|---|
| $0 | シェルスクリプトファイル名 |
| $1 | 1番目の引数 ※2番目の引数の場合は$2とする |
| $$ | 現在のシェルのプロセス番号 |
| $# | コマンドラインに与えられた引数の数 |
| $? | シェルが最後に実行したコマンドの終了ステータス(0=正常終了, 1=異常終了, それ以外はエラー) |
| $@ | 全ての引数(区切りはスペース) |
| $* | 全ての引数(区切りは環境変数IFSで指定したもの)) |
ユーザ入力
readコマンド
readコマンドはユーザからの入力値を受け取り、変数に格納してそれを次の処理で使用したい場合に使用するコマンド。
# !/bin/bash
echo -n "名前を入力してください。"
read yourname
echo "${yourname}さん。入力ありがとう。"
条件分岐処理
条件分岐が行われる条件式の真偽を判断して結果を返す。
条件式理解
- ファイル/ディレクトリに関する条件式
| 条件式 | 実行結果 |
|---|---|
| -d ディレクトリ名 | 指定したディレクトリがあれば真 |
| -f ファイル名 | 指定したファイルが通常ファイルであり、存在すれば真 |
| -s ファイル | 指定したファイルのサイズが0より大きいファイルであれば真 |
| -L ファイル | 指定したファイルがシンボリックリンクであるファイルであれば真 |
| -r ファイル | 指定したファイルが存在して、かつ読み込み可能であれば真 |
| -w ファイル | 指定したファイルが存在して、かつ書き込み可能であれば真 |
| -x ファイル | 指定したファイルが存在して、かつ実行可能であれば真 |
| -e ファイル | 指定したファイルがあれば真 |
| ファイル1 -nt ファイル2 | 指定したファイル1が、指定したファイル2よりも修正時刻が新しければ真 |
| ファイル1 -ot ファイル2 | 指定したファイル1が、指定したファイル2よりも修正時刻が古ければ真 |
- 文字列に関する条件式
| 条件式 | 実行結果 |
|---|---|
| -n 文字列 | 文字列の長さが0より大きければ真 |
| -z 文字列 | 文字列の長さが0であれば真 |
| 文字列1 = 文字列2 | 文字列1と文字列2が等しければ真 |
| 文字列1 != 文字列2 | 文字列1と文字列2が等しくなければ真 |
- 数値に関する条件式
| 条件式 | 実行結果 |
|---|---|
| 数値1 -eq 数値2 | 数値1と数値2が等しければ真 |
| 数値1 -ne 数値2 | 数値1と数値2が等しくなければ真 |
| 数値1 -ge 数値2 | 数値1が数値2以上であれば真 |
| 数値1 -gt 数値2 | 数値1が数値2より大きければ真 |
| 数値1 -le 数値2 | 数値1が数値2以下であれば真 |
| 数値1 -lt 数値2 | 数値1が数値2より小さければ真 |
- 論理結合に関する条件式
| 条件式 | 実行結果 |
|---|---|
| !条件 | 条件式が偽であれば真 |
| 条件1 -a 条件2 | 条件1と条件2の両方の条件式が真であれば真 |
| 条件1 -o 条件2 | 条件1と条件2のどちらかの条件式が真であれば真 |
if分岐
コードサンプル
# !/bin/bash
read number
if [ $number -gt 10 ]
then
echo "10より大きい"
elif [ $number -eq 10 ]
then
echo "10と等しい"
else
echo "10より小さい"
fi
繰り返し処理
for文
繰り返しの処理を実行するためには for 文を使用。指定したリストに沿って処理を繰り返す。
コードサンプル
# !/bin/bash
Levels=("Level1" "Level2" "Level3")
echo ${Levels[@]}
for VAR in ${Levels[@]}
do
echo LinuC $VAR
done
# !/bin/bash
for NUM in `seq 1 10`
do
echo LinuC ${NUM}
done
while文
条件文が真である間は、繰り返しの処理を実行するためには while 文を使用。
# !/bin/bash
while read LINE
do
echo "LinuC Level ${LINE}"
done < test.txt
# リダイレクション < でテキストファイル test.txt からの入力に切り替えています。done < test.txt
# により、test.txtファイルの内容を読み込む処理を実行。そのファイル内容はLINE変数に1行
# ごとに読み込まれて格納される。readコマンドで読み込まれるLINE変数が空になるまで「真」と判断
# されて、最終行まで読み込んだ後は「偽」と判断されたwhile文が完了する。
繰り返し処理で活用するコマンド
seqコマンド
シェルスクリプトで、数値を1つずつ増加または減少させる処理を行うために利用するコマンド
# seq 開始数値 終了数値
$ seq 1 5
1
2
3
4
5
# seq 終了数値
$ seq 5
1
2
3
4
5