マニュアル: Bash

投稿日: 更新日: コマンドラインインタフェース GNU

ShellCheckを使おう

以下のサイト/プログラムで、シェルスクリプトの文法をチェックしてくれます。

起動オプション

man bashしたあとすぐ先にあるOPTIONSを参照。

set

起動オプションには、setで指定できるオプションも使えます。 setはビルドインコマンドで、説明を見るには、man bashしたあと、 /^SHELL BUILTIN COMMANDSと入力するのが楽です。

コマンドの結果代入は$(...)を使う

コマンドの結果を代入する方法にはバッククォートを使う方法と、 $(...)を使う方法がありますが、$(...)を使うようにした方がいいです。

その理由は以下に書かれています。

BashFAQ/082 - Greg's Wiki

POSIX標準にも含まれており、bash, dash(Debian), busyboxなどでも使えるため、 互換性の問題もありません。

変数展開

以下は、次のシェルで確認しています。

未定義、空の場合の定義

FOO=foo
echo ${FOO:-bar} # => foo

FOO=
echo ${FOO:-bar} # => bar

unset FOO
echo ${FOO:-bar} # => bar
FOO=foo
echo ${FOO:=bar} # => foo

FOO=
echo ${FOO:=bar} # => bar
echo ${FOO}      # => bar

unset FOO
echo ${FOO:=bar} # => bar
echo ${FOO}      # => bar
FOO=foo
echo ${FOO:?foo is undefined} # => foo
echo $?                       # => 0

FOO=
echo ${FOO:?foo is undefined} # => FOO: foo is undefined
echo $?                       # => 1(bash, dash), 2(busybox)

unset FOO
echo ${FOO:?foo is undefined} # => FOO: foo is undefined
echo $?                       # => 1(bash, dash), 2(busybox)
FOO=foo
echo ${FOO+bar} # => bar

FOO=
echo ${FOO+bar} # => bar

unset FOO
echo ${FOO+bar} # => (なし)

部分文字列

FOO=foo.tar.gz
echo ${FOO:4}     # => tar.gz
echo ${FOO: -6}   # => tar.gz
echo ${FOO:4:3}   # => tar
echo ${FOO: -6:3} # => tar

単語の長さ

FOO=foo.tar.gz
echo ${#FOO} # => 10

単語の削除

FOO=foo.tar.gz
echo ${FOO#*.}  # => tar.gz
echo ${FOO##*.} # => gz
echo ${FOO%.*}  # => foo.tar
echo ${FOO%%.*} # => foo

単語の置換

FOO=foo.tar.tar.tar.gz
echo ${FOO/gz/bz}   # => foo.tar.tar.tar.bz
echo ${FOO/t*r/bar} # => foo.bar.gz

条件式

数値は「以上」「以下」などを使用するためアルファベット(eqなど)を使い、 文字列はその必要がないから、=を使うと覚えるといいかも。 (でも辞書順の比較はありますね)

case

case

以下のような感じで書きます。

case $VAL in
  a | b)
    ...
    ;;
  c | d)
    ...
    ;;
  *)
    ...
    ;;
esac

引数の解析

ビルドインコマンドにgetoptsがある(未調査)。

変数が定義されているかどうかのチェック

以下のようにすればよい。この場合、VALが未定義の場合は '-' 以降、すなわち空文字になる。

if [ "${VAL-}" = "" ]

set -u してるときに変数が未定義または空文字かチェックする for RHEL/CentOS 6 - Qiita

「シェルスクリプト基本リファレンス」のp187に説明がある。

自分自身のパスに移動

# change to topdir
cd `dirname $0`

古い環境での注意点

3系列のときは、配列が使えなかったはず。

コマンドでエラーが出ても続行

bash スクリプトの先頭によく書く記述のおさらい | Money Forward Engineers' Blog

command || true

公式サイト



ページトップへ戻る