bash

  • 正規表現で文字列が含まれるのかを確認して、値を抜き出す
BASH_REMACHという特別な変数を参照する
if [[ "asd1234567890_1234" =~ ([0-9]{5})([0-9]{5})_1234 ]];
then
 echo ${BASH_REMATCH[0]};
 echo ${BASH_REMATCH[1]};
 echo ${BASH_REMATCH[2]};s
fi

実行
$ bash a.sh
1234567890_1234
12345
67890

  • 関数の書き方

#!/bin/bash

if test `whoami` != 'root'; then
 echo "rootユーザで起動してください。"
 exit 1;
fi

echo "shellの引数1 = $1"
#戻り値設定用変数
rtn=""
func() {
echo "引数1 = $1"
echo "引数2 = $2"
  # 関数内で戻り値設定用変数に戻り値を設定する
  return 0
}
func "aaa" "bbb"
RET_CODE=$?

echo "戻り値=$RET_CODE"
if [ $RET_CODE -eq 0 ]
then
  echo ok
else
  echo ng
fi
実行結果
[root@localhost]# ./b.sh 123
shellの引数1 = 123
引数1 = aaa
引数2 = bbb
戻り値=0
ok

  • デバッグ方法
"-x"付きで起動する
bash -x デバッグするシェルスクリプト

  • ある程度まとまった引数をコマンドに渡す方法
mysql -u root -ppassword hogedb<<EOF
 CREATE TABLE tbl_a AS SELECT * FROM tbl_b limit 1;
 delete from tbl_a
EOF
RET_CODE=$?
if [[ ${RET_CODE} -ne 0 ]];then
  echo "tbl_aの作成に失敗しました:$RET_CODE"
  return 1
fi
例は、テーブルをコピーしつつ、データを削除する方法
EOFという文字列(先頭に空白を入れては駄目)が来るまで何行でも記載できる

  • ログに標準出力(1)と標準エラー(2)出力の両方をリダイレクトする
スクリプト > ログファイル名 2>&1

  • for分で指定回数だけまわす簡単な方法
$ for i in `yes |head -2`
do
	echo $i
done
実行結果は下記のとおり。$iは同じものが入ってしまうので、使えないが、head -nで指定したn回分だけまわしたい時は、これが一番単純かな?
y
y

2014/10/22
最終更新:2016年04月14日 18:29