Shebang(シバン)の書き方
- Unix全般で動作するようにPOSIX準拠で記述する場合:
#!/usr/sh
- Linuxで動けばよい(Bash拡張機能を使いたい)場合:
#!/usr/bin/env bash
参考
シェルオプションを設定する
set [オプション]
で設定する。よく使うオプションは以下の通り。
オプション | 説明 |
---|---|
-e | コマンド実行がエラーとなった場合に処理を終了する。 |
-u | 変数展開時に未設定のものがある場合にエラーとする。 |
-C | リダイレクトで上書きとなる場合にエラーとする。 |
-a | 変数定義で自動的にexportする。 |
-v | シェルの入力行を出力する。 |
-x | トレース情報を出力する。 |
参考
オプションと引数を扱う
getopts
でオプションを読み込んだ後にshift
して引数を$n
で取得する。
# : デフォルトのエラー処理を(エラーメッセージ表示のみ)を無効化する
# a 引数なしオプション
# b: 引数ありオプション
while getopts :ab: OPT; do
case ${OPT} in
a) A=1 ;;
b) B=$OPTARG ;;
# : 引数ありオプションに引数が指定されない場合
# ? 未定義のオプションが指定された場合
:|\?) echo "usage: ..."; exit 1 ;;
esac
done
# 最初の引数が$1にセットされるまでシフトする
shift $((${OPTIND} - 1))
参考
- https://blog.kteru.net/bash-template-for-using-getopts/
- https://qiita.com/laikuaut/items/adf35ecb14c55f6fde92
環境変数をファイルから読み込む
allexport
を有効にしてsource
で読み込む。
set -a; for f in *.env; do . ${f}; done; set +a
参考
ヒアドキュメント
変数に格納するにはcat
を使う。変数展開を無効化するには<< 'EOS'
、最後のEOS
をインデントするには<<- EOS
と記述する。
VAR=$(cat << EOS
one
two
)
参考
y/N ダイアログ
read
で標準入力から読み込み、case
で分岐処理する。
read -p "...? (y/N): " yn
case "${yn}" in [yY]*) ;; *) exit ;; esac
参考
ラッパースクリプト
オプションを引き継ぐ場合は"$@"
で、標準出力と標準エラー出力を加工するには一時ファイルを使う。
stdout=$(mktemp)
stderr=$(mktemp)
command --option "$@" > ${stdout} 2> ${stderr}
# ここで${stdout}と${stderr}を加工する
echo ${stderr} >&2
echo ${stdout}
rm ${stdout} ${stderr}
参考
文字列を変数・コマンド名として評価する
eval
を使う。
key=a
value_a=b
eval echo '$value_'${e}
参考
配列
- 配列の定義:
array=(空白区切りの要素リスト)
- 要素の参照:
array[インデックス]
- 要素の追加:
array=("${array[@]}" 追加要素)
- ループ:
for e in "${array[@]}"
(インデックスが必要な場合はfor i in "${!array[@]}"
)
str="a,b,c"
# カンマ区切りの文字列を空白区切りに変換して()に入れると配列にできる。
# (注意:要素に空白が含まれないことが前提)
array=($(echo ${str} | tr ',' ' '))
# インデックスを使ったループ
for i in "${!array[@]}"; do
echo "${i}: ${array[$i]}"
done
参考