シェルスクリプト
提供: Astarisk Works Wiki
bashのシェルスクリプトの備忘録ページ
目次 |
おやくそく
スクリプトは次の決まり文句で始める。
#!/bin/bash
よいシェルスクリプトを作るチェックリスト
- スクリプトを実行するための前提条件およびメイン・シーケンスを文書化する
- アクションを論理グループに分割する
- 一般的な使用のシナリオに基づいて、実行シーケンスを開発する
- それぞれのシェル・スクリプトに対して、コメントおよび指示を用意する
- ベースラインを作成するため、初期バックアップをとる
- 入力パラメーターおよび環境変数をチェックする
- "usage" に関するフィードバックを提供する
- 「無音」の実行モードを提供する
- エラーが起こったときに、スクリプトを終了する機能を1つ提供する
- 可能であれば、単純なタスクを確実に行うような機能を提供する
- 各スクリプトの出力を取り込みながら、同時に作成中の出力を表示する
- 各スクリプト内で、それぞれの行コマンドの戻りコードを取り込む
- 失敗したトランザクションの数をカウントする
- 出力ファイルにおいて、エラー・メッセージは、判別しやすいように強調表示する
- 可能であれば、「オンザフライ」でファイルを生成する
- スクリプト実行の進行についてフィードバックを提供する
- スクリプト実行状況の要約を提供する
- 解釈しやすい、出力ファイルを提供する
- 可能であれば、クリーンアップ・スクリプト、およびベースラインに戻る方法を提供する
特殊変数
特別な意味を持つ変数。
| 変数 | 説明 |
|---|---|
| $0 | シェルスクリプト名が格納される。フルパス |
| $1,$2…$9,${10}… | 1番目から9番目の引数、10番目以降の引数。引数の番号が2桁の場合{}で囲む |
| $# | 引数の数を格納する |
| $@ または $* | すべての引数のリスト。 |
| $$ | スクリプトが実行されるプロセス番号 |
| $? |
直前のコマンドの実行結果。正常終了時に0が代入される。 直前の処理の結果次第で続けるかどうか決めるような場合に使える。 |
変数展開
| 書式 | 戻り値 |
|---|---|
| $変数名 または ${変数名} | 変数の値 |
| ${変数名:-文字列} | 変数が存在し空でなければ変数の値。そうでなければ文字列 |
| ${変数名:=文字列} | 変数が存在し空でなければ変数の値。そうでなければ変数に文字列を格納する。 |
| ${変数名:?文字列} | 変数が存在し空でなければ変数の値。そうでなければ標準エラーをだしてスクリプトを終了する |
| ${変数名:+文字列} | 変数が存在し空でなければ文字列。そうでなければ無視される |
| ${変数名:位置} | 変数の値の指定位置の文字から末尾までの部分文字列 |
| ${変数名:位置:長さ} | 変数の値の指定位置の文字から指定長さ分の部分文字列 |
| ${変数名#パターン} |
変数の値の先頭からパターンに最短マッチする部分が削除された文字列。パターンにはパス名展開と同じ規則が適用される |
| ${変数名##パターン} | 変数の値の先頭からパターンに最長マッチする部分が削除された文字列。 |
| ${変数名%パターン} | 変数の値の末尾からパターンに最短マッチする部分が削除された文字列 |
| ${変数名%%パターン} | 変数の値の末尾からパターンに最長マッチする部分が削除された文字列 |
| ${変数名/パターン/文字列} | 変数の値で最初にパターンにマッチした部分のみ文字列に置換された文字列 |
| ${変数名//パターン/文字列} | 変数の値でパターンにマッチしたすべての部分のみ文字列に置換された文字列 |
| ${#変数名} | 変数の値の文字数を返す |
コマンド展開
``(バッククオート)、もしくは$()でコマンドを囲むとそのコマンドの実行結果を変数に格納したりすることができる。
> VAR=$(date) > echo $VAR > 2009年 7月 25日 土曜日 14:49:16 JST
評価演算子
コマンド区切り文字
算術式展開
$(())で囲われた表現はクオートされていない文字列またはダブルクオートで囲われた文字列内にある場合には算術式として評価される。
式中、整数でない文字列はシェル変数として扱われる。つまり$や${}をつける必要がない。
制御構文
条件分岐
- 例1
if [ 条件 ]; then
#条件を満たす場合の処理
else
#条件を満たさない場合の処理
fi
- 例2
if [ 条件1 ]; then
#条件1を満たす場合の処理
elif [ 条件2 ]; then
#条件2を満たす場合の処理
else
#どの条件を満たさない場合の処理
fi
繰り返し
関数定義
Tips
シェルスクリプトの配置ディレクトリのパスを取得する
シェルスクリプトが置かれているディレクトリのパスを取得したいときには次の様にする この例は、スクリプトを実行するときの実行ディレクトリがどこであってもスクリプトファイルが置かれているディレクトリのパスを出力する。
#!/bin/bash DIR=`dirname $0` echo $DIR
次の例では実行パスにかかわらずスクリプトをおいた同じディレクトリにファイルを出力する。 たとえば、cronでスクリプトを実行してもシェルスクリプトと同じ場所に処理結果を出力できる。
#!/bin/bash cd `dirname $0` echo "hogehoge" > output.txt
printf を使う
bashではC言語と同様のprintfが使える。
VAR=1 printf "%05d" $VAR 実行結果 00001
sprintfはないが、同様のことをしたければ次の様にする
VAR=1 OUT=$(printf "%05d" $VAR) echo $OUT 実行結果 00001
ファイルを読み込む
FILE=./hogehoge.txt
while read line ; do
#ここに一行ごとに実行したい処理を実装する
echo $line
done < $FILE
実行ユーザをチェックする
id コマンドを-uオプションで使う
if [ `id -u` == 0 ]; then
echo '実行ユーザがRootです'
fi
配列の要素数を取得する
array=(1 2 3 4 5 6 7 8 9 0)
echo ${#array[@]}
10
ファイル名から拡張子を取得
> arg=hoge.txt
> echo ${arg##*.}
> txt