--------------------------------------------------
◆基本文法
--------------------------------------------------
□if
【構文】
if [ (変数) (式) (条件) ];then
処理
fi
※[と]の内側にはスペースを入れること。
【記述例】
①基本的なif文(数値の判定)
if [ $AAA_FLG -eq 1 ];then
echo ok
fi
②複数条件の判定がある場合(elif,else)
if [ $AAA_FLG -eq 0 ];then
echo aaa
elif [ $AAA_FLG -eq 2 ];then
echo bbb
else
echo ccc
fi
③文字列の判定
$EMP_NM=ishida
if [ $EMP_NM = 'ishida' ];then
echo ok
fi
※シングルクォートで囲むことで確実に文字列と判別される。
④ファイルの存在チェック
if [ -f test.sh ];then
echo test.sh exists.
fi
※オプション -f:ファイルが存在すれば真 -d:ディレクトリが存在すれば真 -e:存在すれば真
⑤否定
if [ ! -f test.sh ];then
echo test.sh not exists.
fi
⑥or and
or if [ -f test.sh || -d test.sh ];then
and if [ -f test.sh && -d test.sh ];then
□case
【記述例】
case ${AAA_FLG} in
aaa*) echo aaaa;;
bbb*) echo bbb;;
1*) echo ahoahoi;;
*) echo error!;;
esac
□for
【構文】
for 変数 in 値1 値2…
【記述例】
①findの結果を使用してforループをまわす
for bkupFile in `find ${bkup_dir} -type f -name "*.tar.gz"`
do
echo "abc"$bkupFile
done
→findの結果をbkupFileアタマに"abc"をつけて出力
□while
条件がtrueである限り処理を実行する
【構文】
while [条件]
do
処理
done
【記述例】
①変数の値が7から1までechoを実行する
cnt=7
while [ $cnt -ge 1 ]
do
cnt=`expr $cnt - 1`
echo $cnt
done
②findの結果を変数にセットして、findの結果分処理を実行する (下記例:findでヒットしたファイルの中身を全てクリアする)
while read i ;do
echo "null copy ${i}"
cp /dev/null "${i}"
done <<EOF
`find . -type f`
□until
■条件文の書き方
ifやwhile分などで使用できる条件文の文法は以下のとおり。
・文字列評価
string1 = string2 両者が同じ
string1 != string2 上の反対
・数値評価
num1 -gt num2 num1 > num2
num1 -ge num2 num1 >= num2
num1 -eq num2 num1 = num2
num1 -le num2 num1 <= num2
num1 -lt num2 num1 <num2<br>
num1 -ne num2 num1 not = num2
・ファイル検査
-r file file 読み込み可
-w file file 書き込み可
-x file file 実行可
-e file file 存在
-s file file が空でない
-d file file はディレクトリ
-f file file は通常のファイル
■標準出力/エラー出力のリダイレクト
STDOUTのリダイレクト> file
STDOUTの追加リダイレクト>> file
STDERRのリダイレクト2> file
STDERRの追加リダイレクト2>> file
STDOUTとSTDERRのリダイレクト> file 2>&1
STDOUTとSTDERRの追加リダイレクト>> file 2>&1
STDOUTとSTDERRをパイプを通してコマンドに渡す2>&1 | command
STDOUTとSTDERRを別々のファイルにリダイレクト> file1 2> file2
STDOUTとSTDERRを別々のファイルに追加リダイレクト>> file1 2>> file2
【記述例】
①エラー出力を破棄する (/dev/nullにリダイレクトすることで出力を無視できる)
find / -name hoge 2>/dev/null
②標準出力とエラー出力を別々にログ出力する。
find / -name hoge >> test.log 2>> err.log
--------------------------------------------------
◆サンプルコード
--------------------------------------------------
■無限ループ
while true
do
ntpdate [hostname]
sleep 5
done
■参考資料
http://www.sci.hokudai.ac.jp/~inaz/doc/B/Education/node15.html
http://hp.vector.co.jp/authors/VA012953/unix/cs_frame.html