はじめに
最近、シェルスクリプトを書くことが多い。 何度も調べるのが面倒なので、メモを残しておく。 自分がよく使うものだけなので、網羅性はない。 理屈どうこうより、コピペですぐ使えるようにしておく。
条件分岐 (構文)
if
if [ 条件 ]; then # fi
if 〜 else
if [ 条件 ]; then # else # fi
if 〜 else if 〜 else
if [ 条件 ]; then # elif [ 条件 ]; then # else # fi
条件分岐 (文字列)
文字列の比較 (等しい)
if [ "$STR" = "foo" ]; then # fi
文字列の比較 (等しくない)
if [ "$STR" != "foo" ]; then # fi
空文字列かどうか
if [ -z "$STR" ]; then # fi
変数の値で示されるパスがファイルかどうか
if [ -f "$VAR" ]; then # fi
変数の値で示されるパスがディレクトリかどうか
if [ -d "$VAR" ]; then # fi
変数が定義されているかどうか
if [ -v VAR ]; then # fi
間接参照する変数が定義されているかどうか
# VAR="hello,world!" INDIRECT_VAR="VAR" if [ -z "${!INDIRECT_VAR+undefined}" ]; then echo "${INDIRECT_VAR} is undefined:" else echo "${INDIRECT_VAR} is defined: ${!INDIRECT_VAR}" fi
上掲のコード中の${!INDIRECT_VAR+undefined}
の+
以降の文字は何でもよい。
繰り返し (構文)
値の列挙による繰り返し (ハードコーディングによる)
for VAR in value1 value2 value3; do # done
値の列挙による繰り返し (コマンド実行による)
この例はls
の結果を繰り返し処理している。
for VAR in `ls`; do # done
関数
関数定義
function foo() { # }
関数呼び出し
foo param1 param2
ヒアドキュメント
ヒアドキュメントをコマンドに標準入力として渡す
以下はcat
に標準入力として渡して、画面に表示する例。
cat << EOS foo EOS
ヒアドキュメントをファイルに出力する
cat << EOS > output.txt foo EOS
ヒアドキュメントで変数展開をしない
wordをクォートする。 ここではEOSがwordにあたる。
cat << 'EOS' > output.txt foo EOS
変数のデフォルト値(代替値)
ややこしくて、なかなか頭に入らない。。。
結論としては、${VAR:-default}
だけ覚えておけば、実用上は事足りそう。
以下のスクリプトを実行してみる。
#!/bin/bash echo '(VAR is undefined)' echo '${VAR+default} = '"${VAR+default}" echo '${VAR:+default} = '"${VAR:+default}" echo '${VAR-default} = '"${VAR-default}" echo '${VAR:-default} = '"${VAR:-default}" VAR="" echo '' echo 'VAR=""' echo '${VAR+default} = '"${VAR+default}" echo '${VAR:+default} = '"${VAR:+default}" echo '${VAR-default} = '"${VAR-default}" echo '${VAR:-default} = '"${VAR:-default}" VAR="hello,world!" echo '' echo 'VAR="hello,world!"' echo '${VAR+default} = '"${VAR+default}" echo '${VAR:+default} = '"${VAR:+default}" echo '${VAR-default} = '"${VAR-default}" echo '${VAR:-default} = '"${VAR:-default}"
結果は以下のようになる。
(VAR is undefined) ${VAR+default} = ${VAR:+default} = ${VAR-default} = default ${VAR:-default} = default VAR="" ${VAR+default} = default ${VAR:+default} = ${VAR-default} = ${VAR:-default} = default VAR="hello,world!" ${VAR+default} = default ${VAR:+default} = default ${VAR-default} = hello,world! ${VAR:-default} = hello,world!
その他
スクリプトの配置ディレクトリを変数に代入する
BASE_DIR=$(cd $(dirname $0); pwd)
参考
Bash Reference Manual
How to check if an indirectly referenced variable is unset