tips/shell

Last-modified: 2009-04-14 (火) 21:43:39

●カーソル移動など
Ctrl+A・・・カーソルを行頭に
Ctrl+E・・・カーソルを行末に
Ctrl+K・・・カーソルから行末まで削除

cd - ・・・直前までいたディレクトリに移動


●デバッグ
bash -n ・・・構文チェック
bash -x ・・・(標準エラー出力に)デバッグ情報表示


●本処理までに行うこと
set -u
umaskの設定
環境変数のexport(LANG,TZなど)
起動権限チェック(whoami)
(必要であれば)二重起動チェック
パラメータチェック


●FTP処理の自動化
ftp -n -v localhost << END >result.txt
user USERID PASSWORD
passive
binary
put FILE_NAME
bye
END


結果はresult.txtで検索するとかそもそもexpectを使うとか
result.txtの後ろに&を付けて子プロ化も可。


●setコマンド
set aa bb cc
などとすると
$1がaa
$2がbb
$3がcc
となる
たとえば定型フォーマットのファイルを処理する場合などは
while read LINE
do
set $LINE
done
とすると
columnを$1 $2 $3...でreadすることが可能


●ファイル読み込み
○その1

while read LINE

do

done < ファイル名
※この場合、while内は別プロセスにはならない

○その2

cat ファイル名 |

while read LINE

do

done
※この場合、while内は別プロセスになる
 while内の変数の変更がwhile外で適用されないなどの問題があるため
 その1の方法を使うほうが無難


●リスト読み込み
○その1

Command |

while read LINE

do

done
※この場合、while内は別プロセスになる
 while内の変数の変更がwhile外で適用されないなどの問題があるため
 その2の方法を使うほうが無難

○その2(HereDocumentを使用)

while read LINE

do

done << END

`Command`

END
※この場合、while内は別プロセスにはならない

・読み込み

while IFS=: read USER PASS UID GID ~

do

echo $USER <-そのまま変数で処理可能

echo $UID

done < /etc/passwd
※IFSはセパレータ指定


●forについて

for i in `コマンド`

do

done

のような書式で、コマンドの結果が1行複数フィールドの場合、
デフォルトのIFSにスペースも含まれるため、1行ごとのループではなく、
1フィールドごとのループになってしまう。
1行ごとのループにしたい場合はIFSに改行を指定する。
forの内は別プロセスにはならない.

IFS=" ←改行

"

for i in `コマンド`

do

done
こんな感じ。


if [ "$HOGE" = "" ];then
判定の変数は「"」で囲む。(変数がどのような状態でもエラーにならないように)

・配列
#!/bin/bash
array[0]="HOGE"
array[1]="FOO"
echo ${array[0]}
echo ${array[1]}


"test -s"でファイルサイズが0か確認可能

Command |

while read $LINE
を使う場合はCommandの結果がない場合も考慮して
Commandの結果を">/dev/null"すること


●数字チェック
以下はHOGEが数字8桁かをチェック

echo $HOGE | grep -w -e "[0-9]\{8\}"

の結果をif [ -z 結果 ]や$?で確認する


●フルパス中の最下層のディレクトリを取り出す(awk)
/aaa/bbb/ccc/ddd.txtのcccを取り出す

echo $DIR_NAME | awk -F/ '{print $(NF-1)}'

-F:デリミタの指定


●シェル関数でパラメータとして渡した変数に値を代入する
func(){

   _val=$1
   eval `echo $val`=値

}
mainでは以下のようにfuncをコールする
func "PARAM"


●標準エラー出力を画面に表示しながらファイルにもライトする
標準出力と標準エラー出力を入れ替えてteeコマンドに渡す
command 3>&1 1>&2 2>&3 | tee ファイル名



cat << EOF |


EOF
while read LINE
do
command
done
これだと別プロセスなので
while read LINE
do
command
done << EOT


EOT
でOK



read -p "message" 変数
でread時にメッセージを表示できる


●ifで条件をグルーピング
if [ 条件1 -o \( 条件2 -a 条件3 -a 条件4 \) ]; then
などの書き方


●プロセスの死活監視
psの結果やlockfile(/var/lock/subsys/)やPIDファイル(/var/run/)を見るとよい
※但し、PIDファイルはプロセス起動してからしばらくしないと作成されない場合が
あるので注意。lockfileを見るのがよいかも