原則、Bourne Shell 互換のものを書く
- 実行中のスクリプトがあるディレクトリをフルパスで取得
SCRIPT_DIR=$( cd "$( dirname "$0" )" && pwd -P )
この場合、実行スクリプト自身がシンボリックリンクだと正しい判定ができない。以下のような実装が必要。
function __readlink_f {
local t="$1"; local n=
(while [ "$t" ]; do cd $(dirname "$t"); n=$(basename "$t"); t=$(readlink "$n"); done; echo "$(pwd -P)/$n")
}
SCRIPT_PATH=$(__readlink_f "$0")
SCRIPT_DIR=$(dirname "${SCRIPT_PATH}")
- 変数が未定義または空文字だった場合にデフォルト値を代入
NAME=${NAME:-"default_value"}
- 特定ディレクトリ配下の条件を満たすファイルを削除
/usr/bin/find $PATH_TO_FIND -type f -name '*.gz' -mtime +$PRESERVE_DAYS -delete
- パラメータの2個目以降を取得
$ f() { echo "${@:2}" }
$ f 1 2 3 4 5
2 3 4 5
- シェルスクリプト終了時に一時ファイルを削除
TMP_FILE="/tmp/$(basename "$0").$$.tmp"
trap "rm -f ${TMP_FILE}" EXIT
- [Linux] サーバに接続されているディスクのマウントポイントを列挙
df --output=source,target | grep ^/dev | awk '{print $2}'
- コマンドの存在をチェック
# assert that all required commands exist
assert_command_exists() {
while [ -n "$1" ]; do
command -v $1 >/dev/null 2>&1 || {
echo "Command '$1' is required but not installed. Aborting."
exit 1
}
shift
done
}
- Yes/No プロンプト
# print prompt and return yes/no
prompt_yesno() {
local prompt=$1
read -p "$prompt [y/N]: " yn
case "$yn" in
[Yy]) return 0;;
*) return 1;;
esac
}
-
シェルスクリプト中のコマンドで失敗した場合に即終了とする
- シェルの中で
set -e
- or シェル起動時に
bash -e
- シェルの中で
-
ファイルの内容を入力と同時に書き換える (一時ファイルなし)
(rm -f -- "${FILEPATH}" && COMMAND > "${FILEPATH}") < "${FILEPATH}"
- 参考: シェルスクリプトを極める
- 標準入力から読み込んだ内容を 1行ずつ配列に格納する
IFS=$'\n' lines=($(cat))
または
declare -a lines ### lines=() でも可
while IFS= read line; do
lines+=("$line")
done
- 配列の要素を全て削除
unset arr[@]
- 配列のコピー
dst_arr=("${src_arr[@]}")
- 配列の内容を表示
printf '%s\n' "${arr[@]}"