よく使うコード。
スクリプトの名前を取得する。
ログの名前やPIDファイル名を生成する際に使える。
(記述)
LNAME=`basename "${0}"`;
LTITLE=`basename "${0}" .sh`;
(実行例)
/path/to/script-name.sh
(実行結果例)
script-name.sh
script-name
スクリプトの実行ディレクトリパスを取得する。
スクリプトで使う設定ファイルやログ出力先を相対パスで定義する際に使える。
(記述)
LHOME=`dirname "${0}"`
(実行例)
/path/to/script-dir.sh
(実行結果例)
/path/to
多重起動の防止(厳密でない処理)
(記述)
#!/bin/bash
LHOME=`dirname "${0}"`;
LNAME=`basename "${0}"`;
LTITLE=`basename "${0}" .sh`;
### PIDファイルの検索
ps `cat "/var/run/${LTITLE}.pid" 2>/dev/null` >/dev/null 2>&1;
if [ $? -eq 0 ]; then
echo "ERROR: 多重起動";
exit 1;
else
echo $$>"/var/run/${LTITLE}.pid";
fi;
read -p 何か入力するまで停止 INPUT
(実行/結果例)
バックグラウンドで実行
./prevent-multiprocess.sh &
もう1つ起動
./prevent-multiprocess.sh
ERROR: 多重起動
(補足)
上記の仕様は
TIPS
メッセージ出力
# 1 tag
# * message.
function msg() {
TAG=${1};
shift;
echo "${TAG}: "${1:+"$@"};
}
OSコマンド
# 1 expected return code.
# * command line
function os_cmd() {
RTNOK=${1};
shift;
msg "INFO" "START "${1:+"$@"};
eval ${1:+"$@"};
RTN=$?;
if [ "${RTN}" == "${RTNOK}" ]; then
msg "INFO" "END(OK) "${1:+"$@"}";(${RTN})";
else
msg "INFO" "END(NG) "${1:+"$@"}";(${RTN})";
fi;
}
OSバージョンチェック
OS_VERSION_6=\(Redhat\|CentOS\)\ release\ 6\\..*
OS_VERSION_7=\(Redhat\|CentOS\)\ [[Linux]]\ release\ 7\\..*
OS_VERSION_FILTER=\^\(${OS_VERSION_6}\|${OS_VERSION_7}\)$
# OSバージョンを満たしているかどうか
# 0が返った場合は、システム要件を満たしています。
# 1が返った場合は、システム要件を満たしていません。
# それ以外が帰った場合は、システム要件の確認に失敗しています。
function is_os_version_ok() {
cat /etc/redhat-release | grep -E "${OS_VERSION_FILTER}" 2>/dev/null;
if [ $? -eq 0 ]; then
return 0;
else
return 1;
fi;
}
OSアーキテクチャチェック
uname -m | grep -E "^x86_64$"
if文で使えるスイッチ
-f |
ファイルの存在確認 |
-d |
ディレクトリの存在確認 |
-r |
読み取り確認 |
-w |
書き込み可能確認 |
-x |
実行確認 |
-O |
現在のプロセスの所有者であることの確認 |
-n |
文字列の長さが0より大きいことの確認 |
-z |
文字列の長さが0であることの確認 |
補足(-z)
環境変数をチェックする場合は、未定義の場合でも0になるため真となる。
そのため環境変数の定義チェックに使える。
おまじない的な書き方(${1:+"$@"})
スペースを含む引数を適切に扱うための書き方。
#!/bin/bash
for i in ${1:+"$@"}
do
echo $i;
done;
実行例
./test.sh "a b" c
実行結果
a b
c
最終更新:2016年01月03日 22:14