Skip to main content

Bashの特殊変数もの

文字列変換系

記法意味他の書き方
${AAA:-デフォルト値}カラの場合にデフォルト値を返す
${AAA:=デフォルト値}カラの場合にデフォルト値を代入
${AAA:+マスキング}カラでない場合に変更後の値を返す
${AAA%/*}後方を置換dirname $AAA
${AAA##/}前方を置換basename $AAA
${AAA^^}大文字に変換`echo "$AAA"
${AAA,,}小文字に変換`echo "$AAA"
LENGTH=${#AAA}文字列長
  • 覚えられないし、急に出てきたときも読めなさそうなので、基本使わない方針にしようかな。。
  • %, # の1個は最短マッチ、2個は最長マッチ

用例:

bash
ARG1="${1:-aaa}"  # 第1引数がなければデフォルト値(ここでは "aaa")を使う

引数まとめて

記法意味
"$@""" で囲った単位で引数を取得
$@引数のスペース区切り ("" を無視)
$*引数のスペース区切り ("" を無視)
  • 意図通りは "$@" だろうなと思う

引数の後半を配列として取り出す

記法意味
OPTIONS=("${@:4}")引数の4つめ以降を配列に格納

exit コード

記法意味
$?終了コード (正常 = 0)
$PIPESTATUS各パイプの終了コード (配列)

自身のファイル名

記法意味
$0コマンドラインから呼び出したファイル名
$BASH_SOURCEソースファイル名
  • zsh だと $0$BASH_SOURCE 相当になるらしい
呼び出し方$0$BASH_SOURCE
コマンドラインから ./親.sh./親.sh./親.sh
./親.sh から . 子.sh./親.sh子.sh
./親.sh から ./子.sh./子.sh./子.sh

特定の文字列を含む

特定の文字を含むかを判定(リテラル)

bash
if [[ "$TEXT" == *"some text"* ]]; then
echo "含まれている"
fi
bash
case "$TEXT" in
*"some text"*) echo "含まれている" ;;
esac
bash
if echo "$TEXT" | grep -qF "some text"; then
echo "含まれている"
fi