Jaybanuan's Blog

どうせまた調べるハメになることをメモしていくブログ

bashのシェルスクリプトでよく使うコードスニペット

はじめに

最近、シェルスクリプトを書くことが多い。 何度も調べるのが面倒なので、メモを残しておく。 自分がよく使うものだけなので、網羅性はない。 理屈どうこうより、コピペですぐ使えるようにしておく。

条件分岐 (構文)

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)

参考