「shell」の編集履歴(バックアップ)一覧はこちら
「shell」(2008/02/29 (金) 11:23:58) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
if
構文
if 条件
then
条件が成立した時に実行するコマンド
else
条件が不成立の時に実行するコマンド
fi
例
if [ -n ${TEST}]
then
echo 'this is true'
else
echo 'this is false'
fi
条件
ファイル形式のチェック
-b ファイル名 指定したファイルがブロックデバイスファイルなら真である。
-c ファイル名 指定したファイルがキャラクタデバイスファイルなら真である。
-d ファイル名 指定したファイルがディレクトリなら真である。
-f ファイル名 指定したファイルが通常ファイルなら真である。
-L ファイル名 指定したファイルがシンボリックリンクなら真である。
-p ファイル名 指定したファイルが名前付きパイプなら真である。
-S ファイル名 指定したファイルがソケットなら真である。
ファイルパーミッションのチェック
-g ファイル名 指定したファイルにSGIDがセットされていれば真である。
-k ファイル名 指定したファイルにスティッキービットがセットされていれば真である。
-r ファイル名 指定したファイルが読み取り可能なら真である。
-u ファイル名 指定したファイルにSUIDがセットされていれば真である。
-w ファイル名 指定したファイルが書き込み可能なら真である。
-x ファイル名 指定したファイルが実行可能なら真である。
その他のファイルのチェック
-e ファイル名 指定したファイルが存在すれば真である。
-s ファイル名 指定したファイルのファイルサイズが0より大きければ真である。
文字列のチェック
-n 文字列 文字列の長さが0より大きければ真である。
-z 文字列 文字列の長さが0であれば真である。
文字列1 = 文字列2 2つの文字列が等しければ真である。
文字列1 != 文字列2 2つの文字列が等しくなければ真である。
数値のチェック
数値1 -eq 数値2 2つの数値が等しければ真である。
数値1 -ge 数値2 数値1が数値2以上であれば真である。
数値1 -gt 数値2 数値1が数値2より大きいのであれば真である。
数値1 -le 数値2 数値1が数値2以下であれば真である。
数値1 -lt 数値2 数値1が数値2未満であれば真である。
数値1 -ne 数値2 2つの数値が等しくなければ真である。
論理結合
!条件 条件が偽であれば真である。
条件1 -a 条件2 条件1と条件2の両方が真であれば真である。
条件1 -o 条件2 条件1と条件2のどちらかが真であれば真である
コマンドの処理時間を測定する
構文
time [コマンド]
例
テキストファイルのSQLを1文字づつ取得し、最後に「;」来るまで連結する。
そのSQLをDBで実行し、timeで処理時間を計測する。
#!/bin/sh
MYSQL_PASSWD=$1
MYSQL_DBNAME=roomie
SQL_FILE=/tmp/sql.txt
if [ $# -ne 1 ]; then
echo 'Usage: ./sql.sh [MySQL_ROOT_PASSWD]'
exit
fi
for UNIQUE_ID in `cat $SQL_FILE`
do
FLG_GREP=`echo "${SQL}" | grep -c ".*;"`
if [ ${FLG_GREP} -eq 0 ];
then
SQL="${SQL} ${UNIQUE_ID}"
else
echo "${SQL}"
time mysql ${MYSQL_DBNAME} -uroot -p${MYSQL_PASSWD} -NB -e "${SQL}" >/dev/null 2>&1
if [ -n ${UNIQUE_ID} ];
then
SQL="${UNIQUE_ID}"
else
SQL=""
fi
fi
done
/tmp/sql.txtの内容
select u_id from tbl_user_master;
select passwd from tbl_passwd_master;
timeの結果をリダイレクトする場合は以下のようにする
括弧でくくらないとダメらしい。
(time echo 'Hello World') 2>/tmp/log.txt
もう1個時間計測(date使ったタイプ)
#!/bin/sh
MYSQL_PASSWD=$1
MYSQL_DBNAME=roomie
SQL_FILE=/tmp/sql.txt
LOG_TEXT=/tmp/result_sql.txt
echo '---- TestSQL for DB performance tuning ----'
if [ $# -ne 1 ]; then
echo 'Usage: ./sql.sh [MySQL_ROOT_PASSWD]'
exit
fi
for UNIQUE_ID in `cat $SQL_FILE`
do
FLG_GREP=`echo "${SQL}" | grep -c ".*;"`
if [ ${FLG_GREP} -eq 0 ];
then
SQL="${SQL} ${UNIQUE_ID}"
else
echo "${SQL}" >>${LOG_TEXT}
START=`date +%s`
mysql ${MYSQL_DBNAME} -uroot -p${MYSQL_PASSWD} -NB -e "${SQL}" >/dev/null 2>&1
END=`date +%s`
SS=`expr ${END} - ${START}`
echo 'start ->' `date`
echo 'finish ->' `date`
echo 'the time required -> '"${SS}" '[s]'
if [ -n ${UNIQUE_ID} ];
then
SQL="${UNIQUE_ID}"
else
SQL=""
fi
fi
done
-------- for --------------------------------
構文
for 変数 in 引数…
do
繰り返し実行されるコマンド
done
例
SQL_FILEに文字がある限りループ
(1行づつ読み込む?)
for UNIQUE_ID in `cat $SQL_FILE`
do
echo '${UNIQUE_ID}'
done
SQL_FILEの内容が以下のような場合
select u_id from tbl_user_master;
結果は下記のようになる
select
u_id
from
tbl_user_id;
if
構文
if 条件
then
条件が成立した時に実行するコマンド
else
条件が不成立の時に実行するコマンド
fi
例
if [ -n ${TEST}]
then
echo 'this is true'
else
echo 'this is false'
fi
条件
ファイル形式のチェック
-b ファイル名 指定したファイルがブロックデバイスファイルなら真である。
-c ファイル名 指定したファイルがキャラクタデバイスファイルなら真である。
-d ファイル名 指定したファイルがディレクトリなら真である。
-f ファイル名 指定したファイルが通常ファイルなら真である。
-L ファイル名 指定したファイルがシンボリックリンクなら真である。
-p ファイル名 指定したファイルが名前付きパイプなら真である。
-S ファイル名 指定したファイルがソケットなら真である。
ファイルパーミッションのチェック
-g ファイル名 指定したファイルにSGIDがセットされていれば真である。
-k ファイル名 指定したファイルにスティッキービットがセットされていれば真である。
-r ファイル名 指定したファイルが読み取り可能なら真である。
-u ファイル名 指定したファイルにSUIDがセットされていれば真である。
-w ファイル名 指定したファイルが書き込み可能なら真である。
-x ファイル名 指定したファイルが実行可能なら真である。
その他のファイルのチェック
-e ファイル名 指定したファイルが存在すれば真である。
-s ファイル名 指定したファイルのファイルサイズが0より大きければ真である。
文字列のチェック
-n 文字列 文字列の長さが0より大きければ真である。
-z 文字列 文字列の長さが0であれば真である。
文字列1 = 文字列2 2つの文字列が等しければ真である。
文字列1 != 文字列2 2つの文字列が等しくなければ真である。
数値のチェック
数値1 -eq 数値2 2つの数値が等しければ真である。
数値1 -ge 数値2 数値1が数値2以上であれば真である。
数値1 -gt 数値2 数値1が数値2より大きいのであれば真である。
数値1 -le 数値2 数値1が数値2以下であれば真である。
数値1 -lt 数値2 数値1が数値2未満であれば真である。
数値1 -ne 数値2 2つの数値が等しくなければ真である。
論理結合
!条件 条件が偽であれば真である。
条件1 -a 条件2 条件1と条件2の両方が真であれば真である。
条件1 -o 条件2 条件1と条件2のどちらかが真であれば真である
コマンドの処理時間を測定する
構文
time [コマンド]
例
テキストファイルのSQLを1文字づつ取得し、最後に「;」来るまで連結する。
そのSQLをDBで実行し、timeで処理時間を計測する。
#!/bin/sh
MYSQL_PASSWD=$1
MYSQL_DBNAME=roomie
SQL_FILE=/tmp/sql.txt
if [ $# -ne 1 ]; then
echo 'Usage: ./sql.sh [MySQL_ROOT_PASSWD]'
exit
fi
for UNIQUE_ID in `cat $SQL_FILE`
do
FLG_GREP=`echo "${SQL}" | grep -c ".*;"`
if [ ${FLG_GREP} -eq 0 ];
then
SQL="${SQL} ${UNIQUE_ID}"
else
echo "${SQL}"
time mysql ${MYSQL_DBNAME} -uroot -p${MYSQL_PASSWD} -NB -e "${SQL}" >/dev/null 2>&1
if [ -n ${UNIQUE_ID} ];
then
SQL="${UNIQUE_ID}"
else
SQL=""
fi
fi
done
/tmp/sql.txtの内容
select u_id from tbl_user_master;
select passwd from tbl_passwd_master;
timeの結果をリダイレクトする場合は以下のようにする
括弧でくくらないとダメらしい。
(time echo 'Hello World') 2>/tmp/log.txt
もう1個時間計測(date使ったタイプ)
#!/bin/sh
MYSQL_PASSWD=$1
MYSQL_DBNAME=roomie
SQL_FILE=/tmp/sql.txt
LOG_TEXT=/tmp/result_sql.txt
echo '---- TestSQL for DB performance tuning ----'
if [ $# -ne 1 ]; then
echo 'Usage: ./sql.sh [MySQL_ROOT_PASSWD]'
exit
fi
for UNIQUE_ID in `cat $SQL_FILE`
do
FLG_GREP=`echo "${SQL}" | grep -c ".*;"`
if [ ${FLG_GREP} -eq 0 ];
then
SQL="${SQL} ${UNIQUE_ID}"
else
echo "${SQL}" >>${LOG_TEXT}
START=`date +%s`
mysql ${MYSQL_DBNAME} -uroot -p${MYSQL_PASSWD} -NB -e "${SQL}" >/dev/null 2>&1
END=`date +%s`
SS=`expr ${END} - ${START}`
echo 'start ->' `date`
echo 'finish ->' `date`
echo 'the time required -> '"${SS}" '[s]'
if [ -n ${UNIQUE_ID} ];
then
SQL="${UNIQUE_ID}"
else
SQL=""
fi
fi
done
-------- for --------------------------------
構文
for 変数 in 引数…
do
繰り返し実行されるコマンド
done
例
SQL_FILEに文字がある限りループ
(1行づつ読み込む?)
for UNIQUE_ID in `cat $SQL_FILE`
do
echo '${UNIQUE_ID}'
done
SQL_FILEの内容が以下のような場合
select u_id from tbl_user_master;
結果は下記のようになる
select
u_id
from
tbl_user_id;