BASHシェルスクリプト覚え書き

2018年5月17日

BASH

たまに BASH のシェルスクリプトを書く時にすぐ忘れて毎回ググったり、「あのあれはどこで書いたっけ」と過去のシェルスクリプトを探し回ったりするのでコピペ用にまとめ。随時更新。

目次

  1. set -e
  2. if
  3. curl
  4. for
  5. while
  6. オプションで -h と渡された時にヘルプを表示する
  7. ヒアドキュメントでファイル出力

set -e

-e オプションをつけるとエラーが出た時に処理が止まるようになります。

#!/usr/bin/env bash
set -e

if

基本形

if の中の変数はダブルクォートで囲み、変数が null のときにエラーが出るのを防ぎます。

if [ "${foo}" == "" ]; then
    # do something
elif [ "${foo}" != "bar" ]; then
    # do something
else
    # do something
fi

正規表現

正規表現は特殊で、文字列をダブルクォートで囲みません。

if [[ "${foo}" =~ ^bar ]]; then
    # do something
fi

タブ文字

barbaz の間にタブ文字がある場合の例です。

if [ "${foo}" == bar$'\t'baz ]; then
fi

ファイルやディレクトリの存在確認

ファイルもディレクトリもどちらも -e で OK です。

if [ ! -e foo.txt ]; then
    echo "foo.txt does not exist"
fi

コマンドの存在確認

if ! type command > /dev/null 2>&1; then
    echo "command does not exist"
fi

if のオプション

if のオプションはたくさんあるので man test 参考にすると良いです。よく使うものだけ抜粋。

-e
ファイルが存在するときに true

-z
文字列の長さがゼロのときに true

-n
文字列の長さがゼロでないときに true

curl

curl は長くなってきたので別の記事にしました。

BASH
curlオプション覚え書き

いつからだったか、Mac に wget コマンドが標準で入らないようになってから curl コマンドを使うことが増えまし ...

続きを見る

for

配列を展開しながらループするとき

names=(
    "foo"
    "bar"
)
for name in ${names[@]}; do
    echo ${name}
done

${i} に 1 から 5 まで代入して 5 回ループするとき

for i in {0..5}; do
    echo ${i}
done

while

whileの開始時点でループの条件を判定するとき

while [ "${foo}" == "bar" ]; do
done

無限ループさせて、ループの中で条件判定して抜けるとき

while [ true ]; do
    # exit loop
    if [ "${foo}" == "bar" ]; then
        break
    fi
done

オプションで -h と渡された時にヘルプを表示する

他に引数やオプションがない時にぱぱっと書く時

if [ "$1" = "--help" ] || [ "$1" = "-h" ] || [ -z "$1" ]; then
    # do something
fi

ヒアドキュメントでファイル出力

cat << EOT > example.txt
foo
bar
baz
EOT

-技術ブログ
-