bash:シェルスクリプト


ShellCheck: シェルスクリプトの静的分析


拡張子でファイル数を集計


FUNCNAME: 関数名の取得


trap: シグナルに応じた処理を実行


awkでの変換


"[[" と "[" の違い


jsonに変数を埋め込む


TSV: タブでの分割

tsvで文字列を分割して取り出したいとき


入力プロンプト


URIの分解


tmpwatchで一定時間以上経過したファイルを削除


コマンドを探す(which, hash, type)


0埋め


文法(syntax)チェック


バッググラウトプロセスの終了待ちと終了ステータス


パスからファイル名/拡張子等の切り出し

tmp_path="/etc/httpd/conf/httpd.conf"
tmp_file=${tmp_path##*/} # httpd.conf
echo $tmp_file # httpd.conf
echo ${tmp_file%.*} # httpd
echo ${tmp_path%/*} # /etc/httpd/conf
echo ${tmp_path##*.} # conf

デーモンを作る


select: 選択式メニュー

選択式メニューを表示し、数字を入力するタイプ。


expect: 対話的なコマンド(ssh, telnet, ftp等)を自動実行


タイムアウト処理


浮動小数点演算


パイプで複数繋げたコマンドの終了ステータスを取得


cron実行時に多重起動の防止


日付の範囲指定


$()演算子


netstatで接続中のコネクション数を数える

# get_netstat_established_count
# @param int port : tcp port
# @return int count
get_netstat_established_count() {
	local port=$1
	local established_count=`netstat -nt | grep ":${port} " | grep "ESTABLISHED" | wc -l`
	echo $established_count
}

エラー処理をシンプルに書く

バッチ処理

bashのバージョン情報の取得

bash --version | perl -ane 'if($.==1 && /version (\d+)\./){ print $1;}'
# 3

a-z等の文字列が欲しい

var=`echo {0..10}` # 0 1 2 3 4 5 6 7 8 9 10

var=`echo {a..z}` # a b c d e f g h i j k l m n o p q r s t u v w x y z

空ディレクトリチェック

if [ -z "$(ls -A ./dirname/)" ]; then
        echo "empty"
else
        echo "not empty"
fi

連想配列/ハッシュ


ヒアドキュメント

まとめて標準入力、標準エラー、ファイル等に出せる

テンポラリファイル名


bashで秒、ミリ秒の取得

#!/bin/bash

loop(){
    for i in {1..10}; do
        sleep 1
    done
}

START_SEC=$SECONDS
START_MSEC=`printf '%.3f' \`date '+%s.%N'\``

loop

END_SEC=$SECONDS
END_MSEC=`printf '%.3f' \`date '+%s.%N'\``

echo $(($END_SEC - $START_SEC))" s."
echo `echo "scale=3;($END_MSEC - $START_MSEC)" | bc`" s."

bash最短関数

bashで関数名だけ用意したい事があるが、空の関数は書くとエラーになる。


タイムゾーンを日本に変更


パイプの先は別シェルなので変数取得やexitが無効


文字色の変更

IPアドレスの取得


関数

sudo実行したユーザ、グループ取得

HOME_USER=${SUDO_USER:-"$USER"}
HOME_GROUP=`id $HOME_USER -g -n`

ファイル名の一括変更


JSONパーサー


算術式


ランダムな数値と文字列


指定回数ループ


OSの判別


複数行コメント


バージョン番号の比較


正規表現


デバッグ

# -x:実行されたコマンドを表示する。変数も展開される。
bash -x test.sh

# -v:実行されるコマンドを表示する。変数は展開されない。
bash -v test.sh

エラーの際に処理を止める/未定義変数を参照した時にエラーとする


文字列操作


bash変数


bash特殊変数

位置パラメータ
$0      シェルスクリプト名を表示
$1〜$9  シェルスクリプトのオプションを表示(数値は位置を現す。10以降は${10}、${11})

引数(オプション)関連
$#      引数の数を表示
$@      $0以外の全ての引数を表示("$@"にした場合は "$1" "$2" "…" のように展開)
$*      $0以外の全ての引数を表示("$*"にした場合は "$1 $2 ..." のように展開)
$-      シェルを起動する際に指定されていたオプションを表示

PID(プロセスID)関連
$?      直前のコマンドの終了ステータスを表示
        0   : 正常
        !0  : 失敗
        2   : 誤った使用
        126 : 実行できない
        127 : 存在しないコマンドの実行
$$      現在のシェルのプロセスIDを表示
$!      最期にバックグラウンドで実行されたコマンドのプロセスIDを表示
$-      現在のオプションフラグ

その他、シェルスクリプトで使いそうなもの
IFS     フィールドの区切り文字
PWD     カレントディレクトリを表示
PPID    親プロセスのプロセスIDを表示
HOME    ホームディレクトリを表示
$SECONDS 秒
$RANDOM  ランダム:0-32767
$LINENO 行番号
${PIPESTATUS[@]} パイプで連結された各コマンドの終了ステータスの配列

区切り文字変更 IFS変数


変数にデフォルト値をセット

NAME=$1
NAME2=${2:-"DEFAULT"}

# NAMEが未定議 or nullの時、デフォルト値を指定。NAMEに代入されない。
echo ${NAME:-"DEFAULT"}
echo "NAME:- $NAME"

# NAMEが未定議 or nullの時、デフォルト値を指定。NAMEに代入される。
echo ${NAME:="DEFAULT"}
echo "NAME:= $NAME"

# NAMEが未定議 or nullの時、stderrに出力し、終了。
echo ${NAME:?"Error"}

# NAMEが定義されている場合、変数に代入。空文字、未設定は空文字
echo ${NAME:+"word"}
echo "NAME:+ $NAME"

高度


tputでメニュー


getopt,getopts


rootやsudoの判別


全引数をダブルクォート付きで渡す


配列変数を使う


シェルスクリプトでカレントディレクトリの取得

CUR_DIR=$(cd $(dirname $0);pwd)

シェルスクリプトの実行ログを記録


搭載メモリをMBで取得

MEM_TOTAL=`perl -e '$m=readpipe("free -m");$m=~/Mem:\s+(\d+)/i;print int($1)'`
MEM_FREE=`perl -e '$m=readpipe("free -m");$m=~/cache:\s+(\d+)\s+(\d+)/i;print int($2)'`

日付形式をチェック


ホスト名にアンダーバーが含まれていたらエラー

 match=`echo "$1" | egrep '^([0-9a-z\-]+)$' -`
 if [ $? != 0  ]; then
         echo "Error : Invalid character. allow [0-9, a-z, -]"
         exit
 fi

添付ファイル: filemy-tmpwatch 1091件 [詳細] filewaiting-for-parallel-tasks.zip 1487件 [詳細] fileselect-yes-no.sh 1181件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-09-16 (木) 21:10:04