Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@mogproject
Last active August 29, 2015 14:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mogproject/485f8c37f00f84a4b621 to your computer and use it in GitHub Desktop.
Save mogproject/485f8c37f00f84a4b621 to your computer and use it in GitHub Desktop.
Shell Script Cheat Sheet

Shell Script Cheat Sheet

原則、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
  • ファイルの内容を入力と同時に書き換える (一時ファイルなし)

Bash 配列の操作

  • 標準入力から読み込んだ内容を 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[@]}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment