BシェルFAQ


文字列の一部分を取り出したい

	
	例1、変数pathの3バイト目から1バイトを変数flgに代入する。
	path="/usr/bin"
	flg = `echo $path | cut -c3`
	echo $flg
	実行するとpathの3バイト目の「s」が返る。
	
	例2、変数pathの2バイト目から7バイトを変数flgに代入する。
	path="/usr/bin"
	flg = `echo $path | cut -c2-7`
	echo $flg
	
	実行すると「usr/bin」が返る。
	
	

文字列の数値チェック

	
	例1、引数$1が数値のときnumericを、数値で無いときnot numericを表示する。
	NUMERIC_CHECK=`echo "${1}" | awk '/[^0-9]/ {print}'`
	if [[ ! -z $NUMERIC_CHECK ]]
	then
	    echo "not numeric"
	else
	    echo "numeric"
	fi
	
	

文字列のバイト数を求める

	
	例1、変数STRのバイト数を求め変数ANSに設定する。
	ANS=`echo ${STR} | awk '{printf "%s",blength($0)}'`
	
	例2、変数STRのバイト数を求め変数ANSに設定する。
	ANS=`printf "${STR}" | wc -c`
	
	例3、変数STRのバイト数を求め変数ANSに設定する。
	STR="abcdefg hijklmn"
	expr length "${STR}"
	実行すると「15」が返る。
	
	

文字列の先頭から指定の文字が最初に現れた位置を返す

	
	例、変数STRの先頭から「:」が最初に現れた位置を変数ANSに設定する。
	ANS=`echo ${STR} | awk '{printf "%s",index($0,":")}'`
	
	例、変数STRの先頭から「:」が最初に現れた位置を変数ANSに設定する。
	STR='abcd:efg'
	ANS=`expr index "${STR}" :`
	
	

文字列の先頭から指定の文字の現れる前までを返す

	
	例、変数STRの1バイト目から空白が現れるまでの文字列を返す。
	STR="abcdefg hijklmn"
	echo $STR | awk '{ print substr($0,1,index($0," ")-1)}'
	
	「abcdefg」が返る。
	
	

文字列の最後の文字を返す

	
	例、変数STRの最後の文字を返す。
	STR="abcdefg hijklmn"
	echo ${STR} | awk '{printf "%s",substr($0,length($0),1)}'
	
	「n」が返る。
	
	例、変数STRの最後の文字を返す。
	STR="abcdefg hijklmn"
	echo ${STR} | cut -c`printf "${STR}" | wc -c`
	
	「n」が返る。
	
	例、変数STRの最後の文字を返す。
	STR="abcdefg hijklmn"
	echo ${STR} | cut -c`expr length "${STR}"`
	
	「n」が返る。
	
	

文字列の先頭から最後−2バイトの文字を返す

	
	例、変数STRの先頭から最後−2バイトの文字を返す。
	STR="abcdefg hijklmn"
	echo ${STR} | awk '{printf "%s",substr($0,1,length($0)-2)}'
	
	「abcdefg hijkl」が返る。
	
	

文字列の最後から2バイトの文字を返す

	
	例、変数STRの最後から2バイトの文字を返す。
	STR="abcdefg hijklmn"
	LEN=`expr length "${STR}"`
	echo ${STR} | cut -c`echo "${LEN} - 1" | bc`-
	
	「mn」が返る。
	
	例、変数STRの最後から2バイトの文字を返す。
	STR="abcdefg hijklmn"
	echo ${STR} | cut -c$(echo "$(expr length "${STR}") - 1" | bc)-
	
	「mn」が返る。
	
	

文字列の先頭と末尾の空白を取り除く

	
	例、変数STRの文字列の先頭と末尾の空白を取り除く。
	STR=" abcdefg "
	printf "%s" ${STR}
	
	「abcdefg」が返る。
	
	

前ゼロ

	
	例、前ゼロ。
	HH=1
	MM=2
	SS=3
	printf "%.2d:%.2d:%.2d\n" ${HH} ${MM} ${SS}
	
	「01:02:03」が出力される。
	
	

区切り文字で区切られた文字列のn番目のフィールドを返す

	
	例、変数STRの区切り文字が「/」でn番目のフィールドを返す。
	STR="abc/def/ghi/jkl"
	echo ${STR} | awk -F/ '{print $NF}'
	
	「jkl」が返る。
	
	

区切り文字で区切られた文字列のn番目のフィールド以外を返す

	
	例、変数STRの区切り文字で区切られた文字列のn番目のフィールド以外を返す。
	STR="/abc/def/ghi/jkl/mno"
	echo ${STR} | awk -F/ '{for(i=2;i<NF;i++){printf "/%s",$i}printf "\n"}'
	
	「/abc/def/ghi/jkl」が返る。
	
	

自分のコマンド名

	
	自分のコマンド名
	typeset -R27 MY_NAME=`basename $0`
	
	

計算

	
	例1、「(1+2)*3」
	ANS=`echo "(1+2)*3" | bc`
	echo ${ANS}
	
	実行するとANSに「9」が返る。
	
	例2、「(a+b)*c」
	a=1
	b=2
	c=3
	ANS=`echo "($a+$b)*$c" | bc`
	echo ${ANS}
	
	実行するとANSに「9」が返る。
	
	例3、「(1+2)*3」
	(( ANS=(1+2)*3 ))
	echo ${ANS}
	
	実行するとANSに「9」が返る。
	
	

標準入力から変数へ代入する

	
	read INPUTDATA
	echo ${INPUTDATA}
	
	

一定サイズ以上のファイルを探す

	
	例、1234バイト以上のファイルを全て表示する。
	find / -size +1234c -print
	
	

何日か前に作成されたファイルを削除したい

	
	例、カレントディレクトリ内のファイルで7日以上前に作成されたファイルを削除する。
	for i in `find ./ -mtime +7`
	do
	  if [[ -f ${i} ]]
	  then
	    rm ${i}
	    if [[ $? != "0" ]]
	    then
	      echo "削除エラー ${i}"
	    fi
	  fi
	done
	
	例、カレントディレクトリ内のファイルで7日以上前に作成されたファイルを削除する。(一行にしたもの)
	find ./ -mtime +7 -exec rm {}\;
	
	

ファイルが存在するか?

	
	例1、testを使う。
	if test -f FileName
	then
	  echo "有り"
	else
	  echo "無し"
	fi
	
	例2、条件式を使う
	if [ -f FileName ]
	then
	  echo "有り"
	else
	  echo "無し"
	fi
	
	例2、Kシェルの場合
	if [[ -f FileName ]]
	then
	  echo "有り"
	else
	  echo "無し"
	fi
	
	

テキストファイルの読み込み

	
	例1、file.txtを一行ずつ変数DATAへ読込み表示する。
	while read DATA
	do
	    echo "${DATA}"
	done < file.txt
	
	例2、file.txtの空白行とコメント(先頭が#)を除く行を変数DATAへ読込み表示する。
	for DATA in `sed -e '/^$/d' -e '/^#/d' file.txt`
	do
	    echo "${DATA}"
	done
	
	

テキストファイルの空白行を削除したテキストファイルを作成する

	
	例1、in_file.txtの空白行を削除してout_file.txtを作成する。
	sed '/^$/d' in_file > out_file
	
	

テキストファイル中の文字列の一括変更

	
	例1、file1.txtの文字列ABCをDEFに変えてfile2.txtを作成する。
	sed 's/ABC/DEF2/g' file1.txt > file2.txt
	
	

テキストファイルの指定行を表示する

	
	例1、file1.txtの10行目から20行目までを表示する。
	cat file.txt | sed -n '10,20p'
	
	

空(ゼロバイト)ファイルの作成

	
	例、空ファイル(file.txt)を作成する。
	touch file.txt
	
	例、空ファイル(file.txt)を作成する。
	cat /dev/null > file.txt
	
	例、空ファイル(file.txt)を作成する。
	cp /dev/null file.txt
	
	

テンポラリファイルの作成

	
	例1、テンポラリファイルを作成して変数$TMP_FILEにファイル名を設定する。
	TMP_FILE=`mktemp -c 2> /dev/null`
	
	

閏年の判定

	
	if [ ${DATE_YYYY}%4 -eq 0 -a \
	    ! ${DATE_YYYY}%100 -eq 0 -o \
	    ${DATE_YYYY}%400 -eq 0 ]
	then
	    # 閏年
	else
	    # 閏年以外
	fi
	
	

閏年の判定2

	
	cal 2 {西暦} | sed -n '3,8p' | grep 29 > /dev/null
	$?が0なら閏年、$?が1なら普通年
	
	例1、2000年が閏年が調べる。
	cal 2 2000 | sed -n '3,8p' | grep 29 > /dev/null
	$?が0になり閏年。
	例2、2003年が閏年が調べる。
	cal 2 2003 | sed -n '3,8p' | grep 29 > /dev/null
	$?が1になり普通年。
	
	

現在の時刻からの時間の加減算

	
	h_calc.ksh
	#!/usr/bin/ksh
	
	echo `TZ=JST$(printf "%d" $(echo "-9 ${1}*(-1)"|bc));date "+%Y/%m/%d %H:%M:%S"`
	
	※第一引数に時間を渡す。
	
	例、一時間後の時間を求める。
	h_calc.ksh +1
	
	

tailで指定の文字列を含む行を表示する。

	
	例、/log/syslogファイルにloginを含む行が追加されたらその行を表示する。
	tail -f /log/syslog | grep login
	
	

case 使用例

	
	例1、${1}が01〜09か判断して処理する。それ以外のときはエラー。
	case "${1}" in
	  "01"|"02"|"03"|"04"|"05"|"06"|"07"|"08"|"09")
	    USR_NAME="USER${1}"
	    GRP_NAME="USER0"
	    ;;
	  *)
	    "K00001E ユーザ種別エラー"
	    exit 16
	    ;;
	esac
	
	

for 使用例

	
	for 変数 in 代入1〜n
	do
	    式1
	done
	
	例1、変数iに文字a〜fを入れて繰り返す。
	for i in a b c d e f
	do
	    echo $i
	done
	
	例2、テキストファイルをデリミタ(空白・タブ・改行などIFSで設定する)ずつ読み込み変数iに入れEOFまで繰り返す。
	for i in `cat env.txt`
	do
	    echo ">$i<"
	done
	
	

grep 使用例

	
	例1、シンボリックを全て表示する(行の先頭が一致するものを抽出)
	  ls -laR / | grep ^l
	
	

if 使用例

	
	例1、算術式の評価。(数値の比較)
	if (( ${ANS} > 0 ))
	then
	    echo 'ANS > 0'
	else
	    echo 'ANS <= 0'
	fi
	※使える算術式は「==,!=,<,>」
	
	例2、条件式の評価。(文字列の比較)
	if [[ ${ANS} = "" ]]
	then
	    echo 'ANS空白'
	else
	    echo 'ANS空白以外'
	fi
	※使える算術式は「=,!=,<,>」
	
	if [ $? -eq 1 ];then echo "error";fi
	
	if [ $? -eq 1 ]
	then
	    echo "error"
	else
	    echo "OK"
	fi
	
	

ftp

	
	ftp -v -i -n -B 56 HOST_NAME > LOGFILE 2>&1 <<END
	user USER_ID USER_PW
	bin
	cd PUT_DIR
	lcd FTP_DIR
	put FILE_NAME
	bye
	END
	
	

until 使用例

	
	例1、10回繰り返す。
	I=1
	until (( ${I} > 10 ))
	do
	    echo ${I}
	    I=`expr ${I} + 1`
	done
	
	

while 使用例

	
	例1、10回繰り返す。
	I=1
	while (( ${I} <= 10 ))
	do
	    echo ${I}
	    I=`expr ${I} + 1`
	done
	
	例2、引数で渡されたファイル名の内容を表示する。
	while read RECORD
	do
	    echo ${RECORD}
	done < ${1}
	
	例3、永久ループ。
	while true
	do
	    [command list]
	done
	
	

remshで実行したコマンドの戻り値を参照するには?

	
	ANS=`remsh 192.168.1.1 -n "ls -f /tmp/tamdaq.txt > /dev/null 2>&1 ; echo \$?"`
	
	

その他

	
	・シェルが自動的に設定するパラメータ
	$0 コマンド名 
	$# パラメータの数(10進数) 
	$1〜$9 パラメータの内容 
	$* すべてのパラメータの内容 
	$@ $*とほぼ同じ 
	$$ プロセス番号 
	$? 最後に実行したコマンドが戻した(10進数) 
	$- シェルにセットされているオプション 
	$! バックグラウンドで実行された直前のプロセスのプロセス番号 
	$IFS 区切り文字のリスト。通常はスペース、タブ、改行が設定されている。「IFS=$' \t\n'」
	改行だけを設定するには、「IFS=$'\n'」とする。
	設定内容の確認方法(8進数)「echo -n "$IFS" | od -b」 
	
	・パラメータ置換
	$parameter parameterの値に置換 
	$#parameter parameterの長さに置換 
	${parameter:=word} parameterが未設定又はヌルの場合には、parameterがwordに設定し、その後parameterに置き換える。
	STR="xyz"
	echo ${STR:="abc"} 
	${parameter:-word} parameterが未設定の場合には、parameterがwordに設定し、その後parameterに置き換える。
	STR="xyz"
	echo ${STR:-"abc"} 
	${parameter:+word} parameterがヌル以外に設定されている場合には、parameterがwordに設定し、その後parameterに置き換える。
	STR="xyz"
	echo ${STR:+"abc"} 
	${parameter:?word}  
	  
	${parameter#pattern} patternがparameterの値の先頭部分と一致した場合には、parameterから一致した部分を削除した値が、置換される。
	STR="1999/12/31";echo ${STR#*/}
	12/31が出力される。 
	${parameter##pattern} STR="1999/12/31";echo ${STR##*/}
	31が出力される。 
	${parameter%pattern} patternがparameterの値の最後部分と一致した場合には、parameterの値から一致した部分を削除した値に置換される。
	STR="1999/12/31";echo ${STR%/*}
	1999/12が出力される。 
	${parameter%%pattern} STR="1999/12/31";echo ${STR%%/*}
	1999が出力される。 
	
	・「"」と「'」の違い
	abc.shというシェルで以下のような場合
	echo "$0" abc.shと表示され
	echo '$0' $0と表示される
	「"」で囲むとパラメータとして内容を展開されるが「'」はそのまま展開される。
	
	「"」で囲んでその中で「'」で囲んだ場合は置換される。
	STR='ABC'
	echo "${STR}" ⇒ 「ABC」
	echo '${STR}' ⇒ 「${STR}」
	echo "'${STR}'" ⇒ 「'ABC'」
	
	--------------------------------------------------------------------------------
	・コロン「:」
	なにもしたくない時に使います。
	例、file.txtがあるときは何もせず、無かったら「File Not Found」を出力する。
	if test -f file.txt;then
	###############################################################################################################################################################################################################################################################
	else
	    echo "File Not Found"
	fi
	
	--------------------------------------------------------------------------------
	・コマンドの置換「`command` or $(command)」
	チルドで囲まれたコマンドをその実行結果と置き換えます。
	例、PATH=`pwd`
	
	--------------------------------------------------------------------------------
	/dev/null 2>&1 出力先にエラーをリダイレクトする
	/dev/null 1>&2 エラーの出力先に出力をリダイレクトする
	
	--------------------------------------------------------------------------------
	DATE_SFX=`date +%Y%m%d%H%M%S`
	exp1 -eq exp2 exp1 が exp2 と等しければ、真となります。
	exp1 -ne exp2 exp1 が exp2 と等しくなければ、真となります。
	exp1 -lt exp2 exp1 が exp2 より小さければ、真となります。
	exp1 -gt exp2 exp1 が exp2 より大きければ、真となります。
	exp1 -le exp2 exp1 が exp2 以下であれば、真となります。
	exp1 -ge exp2 exp1 が exp2 以上であれば、真となります。
	
	・エスケープ・シーケンス
	\a 警報 
	\b バック・スペース 
	\c 改行を追加しないで行をプリント 
	\f フォーム・フィード 
	\n 改行 
	\r キャリッジ・リターン 
	\t タブ 
	\v 垂直タブ 
	\' シングルクォーテーション 
	\\ バックスラッシュ 
	\n ASCII コードが1桁、2桁、3桁、または4桁の8進数である 8ビット文字 n, 最初の文字はゼロでなければなりません 
	
	・リダイレクション
	<word ファイルwordを標準入力として使用します。 
	>word ファイル word を標準出力として使用します。 
	>|word noclobber オプションを無効にすることを除き、> と同じです。 
	>>word ファイル word を標準出力として使用しファイルの末尾に追加します。  
	<>word 標準入力として読み書きするため、ファイル word をオープンします。 
	<<[-]word   
	<&digit 標準入力がファイル記述子 digit から複写されます。 
	>&digit 標準出力がファイル記述子 digit に複写されます。 
	<&- 標準入力がクローズされます。 
	>&- 標準出力がクローズされます。 
	<&p コプロセスからの入力を標準入力に移します。 
	>&p コプロセスへの出力を標準出力に移します。 
	ファイル記述子0 (標準入力)
	ファイル記述子1 (標準出力)
	ファイル記述子2 (標準エラー)
	
	
	フィールドで抽出
	D1_YY=`echo ${DATE1} | cut -d / -f 1`
	D1_MM=`echo ${DATE1} | cut -d / -f 2`
	D1_DD=`echo ${DATE1} | cut -d / -f 3`
	
	関数に引数を
	function ABC {
	    echo "$1" <-defが表示される
	}
	
	ABC "def" <-関数ABCにdefを渡す
	echo "$1" <-メインの$1が表示される