×

[PR]この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。

[トップページ] [星雲紀行] [MLXS] [WPGen] [自作音楽] [モデル] [vi/vim] [tips] [自己紹介]

shell script tips

目次

  1. はじめに
  2. 連続実行
  3. 引数チェック
  4. 日付の取得
  5. 引数の確認とルート権限の確認
  6. メール送信でコマンド実行終了を通知する
  7. 実行時ファイル、ディレクトリエラーチェック・ログ出力つき実行スクリプト
  8. 日付自動付与バックアップスクリプト
  9. タグリスト抽出(XMLなど)
  10. memo
  11. 参考文献・参考ウェブページ
  12. 履歴

はじめに

このページはシェルスクリプトについてのtip を記載しています。

[content]

連続実行

連続ファイル変換

カレントディレクトリのすべてのppm をpng に変換する。

for i in *.ppm; do convert $i ${i%ppm}png; done

連続ファイルsed 変換

あるテキストファイルでGPixel/s (4 BytePerPixel) を間違えてGB/s と書いてしまったとき、もとに戻すshell script.

for i in *.txt; do sed "s/GB\/s/GPixel\/s \(4 BytePerPixel\)/g" $i > ${i%.txt}-mod.txt ; done
[content]

引数チェック

以下は引数が2 つ以下の時にはusage を示す例。

if [ $# -lt 2 ]; then
	cat <<-END
	usage: command [-f] [-l] filename
		   -f : force mode
		   -l : list command (do noting)
	END
fi

引数が2 つ以外の時を指定するためには [ $# -ne 2 ] とすればよい。

条件式 意味
s1 = s2 文字列s1とs2が等しい
s1 != s2 文字列s1とs2が等しくない
n1 -eq n2 数値n1とn2が等しい
n1 -ne n2 数値n1とn2が等しくない
-e file fileが存在する
-z s1 s1の長さが0である

参考: bashで始めるシェルスクリプト基礎の基礎

[content]

日付の取得

曜日を表す数字を取得する。

STRING_DATE=`date+"%w"`

年月日を取得する。

STRING_DATE=`date+"%Y%m%d"`
[content]

引数の確認とルート権限の確認

スクリプトで実行者がroot であるかどうかを調べる。

#!/bin/sh
# sample
if [ $# -ne 4 -o $(id -u) != "0" ] ;then
	echo "shellscript.sh explanation."
	echo "Run as root."
	echo "usage: ./shellscript.sh AAA BBB CCC DDD"
	exit 1
fi
# ここから本当のscript を書く
解説
$# 引数の数。
-o or
$(id -u) != "0" ルート権限確認
-ne char のnot equal
[content]

メール送信でコマンド実行終了を通知する

コマンド実行終了時にメールでログを送る例。
sendmail などのSMTP サービスが必要。

#!/bin/sh
LOGFILE=/home/user/tmp.log
$ command AAA BBB CCC DDD > ${LOGFILE}
# log message
echo "EXECUTED" >> ${LOGFILE}
uname -a >> ${LOGFILE}
date | nkf >> ${LOGFILE}
# send a mail
mail -s "NOTIFICATION ABOUT END OF SCHEDULED PROGRAM" MAILADDRESS@DOMAIN < ${LOGFILE} 
[content]

実行時ファイル、ディレクトリエラーチェック・ログ出力つき実行スクリプト

テスト自動化のスケジュールするシェルスクリプトなどに使える。

#! /bin/sh
dir1=logs
file1=`date '+%Y%m%d'`
com1=ANY_COMMAND_NAME

if [ ! -f ${dir1}/${file1} ]; then
	echo "error: no such file,  ${dir1}/${file1}"
	exit 1
fi
if [ -f ${com1} ]; then
	echo "error: no such command ${com1}"
	exit 1
fi

# "mkdir -p dirname" で途中のディレクトリもなければ作成します
mkdir -p ${dir1}
if [ $? -ne 0 ];
	 echo "error: cannot generate following directory ${dir1}"
	 exit 1
fi

${com1} > ${dir1}/${file1}
exit 0
[content]

日付自動付与バックアップスクリプト

このコマンドで対象ディレクトリを現在の時刻付きで圧縮・保存します。
cvs やsvn があっても節目でチェックインできないときなど、 ちょっとしたコーディングの節目などに役立ちます。

#!/usr/bin/env sh
#$Id: backupts.sh,v 1.2 2006/06/07 04:20:51 kgussan Exp $
#================================================================
echo "$0: start"
BACKUP_DATE=`date +"%Y%m%d-%H%M"`
LOCAL_HOST=`uname -n`
LOCAL_USR=`whoami`
#BACKUP_FILE=$1-${BACKUP_DATE}.tgz
#
if [ $# -ne 1 ]; then
       echo "$0: backup script with date named."
       echo "$0:"
       echo "$0: Usage: Command [TARGET_DIRECTORY]"
       echo "$0:"
       exit 1
else
       echo "$0: tar archiving ${1}."
       ARG_NOSLASHEND=`echo ${1} | sed 's/\///'`
       #ARG_NOSLASHEND=`echo ${1} | sed 's/\//#SLASH#/'`
       #BACKUP_FILE_NOSLASHEND=`echo ${BACKUP_FILE}`
       BACKUP_FILE=${ARG_NOSLASHEND}-${BACKUP_DATE}.tgz
       echo "$0: tar archiving ${BACKUP_FILE}"

       tar czpf ${BACKUP_FILE} $1
       echo "$0: end."
fi

[content]

タグリスト抽出(XMLなど)

出力を参照し、タグのデータを参照することができる。
シェルスクリプト、page 111, タグの一覧。

#! /bin/sh
# 1) pick up tagged data.
#   1-1) put  data  to pipeline with cat 
#    1-2) URL marking check with sed 
#    1-3) change bracket to return-code with tr
#    1-4) get tag-name and data with awk
#    1-5) sort and uniq 
# 2) display with tabbed.
# 3) each lines is sorted by words and tags.
#
# Usage
# 	taglist xml-file
#

cat "$1" |
  sed -e 's#systemitem *role="url"#URL#g' -e 's#/systemitem#/URL#' |
	tr ' (){}[]' '\n\n\n\n\n\n\n' |
	  egrep '>[^<>]+</' |
		awk -F'[<>]' -v FILE="$1" \
		  '{ printf("%-31s\t%-15s\t%s\n", $3, $2, FILE) }' |
			sort |
			  uniq -c |
				sort -k2,2 -k3,3 |
				  awk '{
					print ( $2 = = Last ) ? ($0 " <----") : $0
					Last = $2
				  }' 
[content]

memo

  • 実行状況の追跡(execution tracing)
    スクリプト実行時の処理を表示する。
    $ sh -x nusers
    スクリプト内部でトレースをONにするには、sh -x と記載する。再びOFFにするにはsh +x と記載する。
[content]

参考文献・参考ウェブページ

[content]

履歴

  • 2006/09/05 新規作成・分岐版
[content]
ご意見、ご感想、誤字、間違い等、お気づきの点がありましたら KGussan@Gmail.com まで連絡ください。
このウェブページの注意・免責事項 Copyright (C) 2004-2012 KGussan. [トップページ]
[PR:元国税局勤務の起業家向け、遺産相続の相談なら植村洋税理士事務所:一時間無料税理士相談。お気軽に。]