サイト内検索:
Loading

bourne shellのTips

| コメント(0) | トラックバック(0)

ディレクトリだけリスト化

ls -F | grep / | sed 's/\///'

 

無限ループの例

以下の文のdo〜doneの間に処理を書けば良い.

#!/bin/sh
while :
do
  ...
done

whileの評価式に書かれているコロンは,組み込みコマンドの一つ(ヌルコマンド)で,常に戻り値0を返す.

 

変数の文字長の取得

${#hoge}で参照できる.

 

引数なしでスクリプトを停止

if [ $# -eq 0 ]; then
  echo "Error messages"
  exit 1
fi

 

固定幅数値の作り方

スクリプト中で以下のようにすると,固定幅数値を作れる.以下の例では$yrの中に入っている数値(例えば10)を4桁の固定幅数値(0010)に置き換える.

y4=`printf "%4.4d" $yr`

 

算術演算

shの変数はすべて文字型として扱われるが,以下のようにすることで算術演算ができる.

n=$((n + 1))

例えば,以下のスクリプトは延々と初期値1に数値1を加えて表示し続ける.

#!/bin/sh
n=1
while :
do
  echo $n
  n=$((n + 1))
done

 

日付時刻付きのログファイル

#!/bin/sh
logfile=log.`/bin/date +%Y%m%d-%H%M%S`.log
touch $logfile

 

ディレクトリ内に大量にファイルがあるときの処理

ディレクトリ内に大量にファイルがあるときにlsコマンドを使うと"argumentl list too long"というエラーがでて処理できないことがある.その際はlsコマンドの代わりにechoコマンドを使う.

echo /home/mailscan/Maildir/cur/* |xargs bsfilter -c -v >>$LOGS 2>&1

 

ファイル名の部分切り出し

ファイル名が例えば連番になっていたりするときに,その連番部分のみや,連番部分以外を取得したい場合がある.その際には,awkコマンドをかませてsplit関数で分解すれば良い.

今,ディレクトリに"file.0001.log, file.0002.log, file.0003.log"というファイルがあるとする.そこで次のスクリプトを実行すると,連番部分のみを表示できる.

[ スクリプト ]
#!/bin/sh
list=`ls file.*.log`
for f in $list
do
  echo $f | awk '{m=split($0,a,"."); print a[2];}'
done
[ 実行結果 ]
0001
0002
0003

echoコマンドの部分を変数に格納することで様々な処理に応用できる.例えば数値部分を1つずらして横に並べ手表示するには以下のようにする.

[ スクリプト ]
#!/bin/sh
list=`ls file.*.log`
for f in $list
do
  n=`echo $f | awk '{m=split($0,a,"."); print a[2];}'`
  n=$((n + 1))
  x=$x" "`printf "%4.4d" $n`
done
echo $x
[ 実行結果 ]
0002 0003 0004

 

位置パラメータを利用して擬似的に配列操作をする

bourne shellには配列はないが,位置パラメータを利用することで擬似的に配列操作ができる.

今,ディレクトリに"file.0001.log, file.0002.log, file.0003.log"というファイルがあるとする.そこで次のスクリプトを実行するとファイルを一覧表示することができる.

[ スクリプト ]
#!/bin/sh
list=`ls *`
set $list
while [ $# -ne 0 ]
do
  echo $1
  shift
done
[ 実行結果 ]
file.0001.log
file.0002.log
file.0003.log
スクリプトファイル

上記のスクリプトでは,カレントディレクトリのファイル名をlsコマンドで取得し,listという変数に代入.その後,setコマンドで,$listをコマンドライン引数として扱うように指定している.

whileループの中で$1として参照されているのは,コマンドライン引数のうち,先頭のものである.その後,shiftコマンドで,$2が$1に,$3が$2にという具合に引数が一つずつ前にずらされる($1は破棄される).これを繰り返し,$#(コマンドライン引数の数)が0になったらループを止めるという処理をしている.

Add to Google

トラックバック(0)

トラックバックURL: http://www.web-cahier.com/mt-5.01/mt-tb.cgi/126

コメントする