シェルスクリプト作成メモ(よく使うパターン編)
前回の基本編では、主に構文まわりを書きました。今回のよく使うパターン編では、よく使う処理の塊を書いていきます。なるべくシンプルに書きましたので、処理を追加することで応用できると思います。
起動時の引数取得
第一引数で処理分岐
case "$1" in
"-a")
echo "-a オプション指定";;
"-b")
echo "-b オプション指定";;
esac
分岐OK
battan@linuxfx-01:~/work$ ./check_arg.sh -a
-a オプション指定
battan@linuxfx-01:~/work$ ./check_arg.sh -b
-b オプション指定
battan@linuxfx-01:~/work$ ./check_arg.sh -c
battan@linuxfx-01:~/work$
処理中に一時的なディレクトリやファイルを作る
ディレクトリやファイル名にプロセスIDを付けて付けるとほぼほぼ被らずに一時的なフォルダやファイルを作成できます。
実行したスクリプトのプロセスIDは、$$ で取得できますので、次のようにすることで自動的に付与できます。
# 一時ディレクトリ
mkdir temp_directory.$$
# 一時ファイル作成
echo "処理結果" > temp_file.$$
# ロックファイル作成
touch temp_file.lock
プロセスIDは再利用されますので、長期間かつ同時並行で多数起動するスクリプトの場合だと重複する可能性があります。その場合は、後述のdateコマンドの+%sを使うとかぶりません。
タイムスタンプを作る
# タイムスタンプ(YYYYMMDD-HHMMDD形式)を変数にセット
var=`date +%Y%m%d-%H%M%S`
# タイムスタンプ(秒)を変数にセット
var=`date +%s`
長いテキストの取り扱い
長い文字列はechoで頑張って書くこともできますが、次のように<<でEOFまでを標準入力に流し込む方が楽です。
#!/bin/sh
usage () {
cat << EOF
--- このコマンドの使い方 ---
conv.sh <inputfile> <outputfile> [option]
inputfileには変換前ファイルを指定してください。
outputfileには変換処理後のファイル名を指定してください。
optionには、次のものが指定できます。
-a : すべて変換
-q : サイレント実行
-f : 出力ファイルを強制上書き
-i : 出力ファイルに書き出す前に確認する
EOF
}
usage
exit 0
応用すると、sqlcmdやmysqlコマンドに直接SQLを流し込むことが可能です。
ファイルリストで処理
これはほんとによく使います。
ls コマンドを実行して、そのファイルに対してなにかをする場合のループ処理。
for i in `ls`; do
# ファイルのバックアップ
cp -p $i $i.bak
done
スクリプト分割
定数や関数を別スクリプトに定義して、それを読み込むとスクリプトファイルを分割できます。例えば、次のように定数(define.sh)や共通関数(common.sh)などを別ファイルにすることで扱いやすくなります。
#!/bin/sh
. define.sh
. common.sh
function main() {
...
return 0
}
main
exit $?
key=valueの分割
キー=値を定義し、引数で指定したキーの値を取得する。
#!/bin/sh
A=100
B=200
C=300
case "$1" in
[A-Z])
egrep "^$1" $0 | awk 'BEGIN{FS="="}{print $2}';;
esac
このサンプルでは、引数がA~Zの場合に自身のスクリプトファイルを引数でgrepし、該当行を=で分割し、値だけを取り出してみます。
battan@linuxfx-01:~/work$ ./keyvalue.sh A
100
battan@linuxfx-01:~/work$ ./keyvalue.sh B
200
battan@linuxfx-01:~/work$ ./keyvalue.sh C
300
battan@linuxfx-01:~/work$ ./keyvalue.sh D
battan@linuxfx-01:~/work$
途中でユーザからの入力を求める
対話形式のスクリプトの場合は、これを使います。自動処理で処理を完結させたい場合はこれを使うと止まってしまいますので注意が必要です。
#!/bin/sh
echo "なにか入力してください"
read s
if [ -z ${s} ]; then
echo "なにも入力がありませんでした"
else
echo "あなたが入力したのは、${s}です"
fi
また思いついたら書きます
ざっと思いつくものだけ書いてみました。現役でシェルスクリプト書いていた頃は、AWKなんかもふんだんに使って、シェル芸人と呼ばれるぐらいいろいろ作っていたんですが、しばらく離れると忘れてしまうものですね。
コメント