自分用のpukiwiki

bashコーディング規約

目的(ゴール)

  1. Linuxにおける基本的なバッチファイルの作成方法を覚える

モチベーション

  1. 一定の品質を保ちたい
  2. 書くたびに書き方が変わるのは好ましくない

バッチシェルの中身について

宣言

シェバング(shebang)

シェバング(shebang)は#!/bin/shではなく#!/bin/bashにする

  1. シバン、シェバンとも言われる
  2. #!/bin/shは実行環境によって様々なシェルにシンボリックリンクになっているので、bashなら#!/bin/bashと明示しよう
#!/bin/bash

インデント

インデントは半角スペース2つ

  1. 1行が横に長くなり折り返されないように

処理内容および使い方をスクリプト内に記載する(usage())

  1. 何をしてくれるスクリプトか、どのように使うのかusage()関数を用意しよう
    1. ヘッダコメントでもいいけど
function usage() {
cat <<_EOT_
Usage:
  $0 [-a] [-b] [-f filename] arg1 ...

Description:
  hogehogehoge

Options:
  -a    aaaaaaaaaa
  -b    bbbbbbbbbb
  -f    ffffffffff

_EOT_
exit 1
}

オプション解析を行う(getopts)

#!/bin/bash

function usage() {
cat <<_EOT_
Usage:
  $0 [-a] [-b] [-f filename] arg1 ...

Description:
  hogehogehoge

Options:
  -a    aaaaaaaaaa
  -b    bbbbbbbbbb
  -f    ffffffffff

_EOT_
exit 1
}

if [ "$OPTIND" = 1 ]; then
  while getopts abf:h OPT
  do
    case $OPT in
      a)
        FLAG_A="on"
        echo "FLAG_A is $FLAG_A"            # for debug
        ;;
      b)
        FLAG_B="on"
        echo "FLAG_B is $FLAG_B"            # for debug
        ;;
      f)
        ARG_F=$OPTARG
        echo "ARG_F is $ARG_F"              # for debug
        ;;
      h)
        echo "h option. display help"       # for debug
        usage
        ;;
      \?)
        echo "Try to enter the h option." 1>&2
        ;;
    esac
  done
else
  echo "No installed getopts-command." 1>&2
  exit 1
fi

echo "before shift"                       # for debug
shift $((OPTIND - 1))
echo "display other arguments [$*]"       # for debug
echo "after shift"                        # for debug

変数の命名規則

定数はreadonly宣言する

定数は大文字、定数以外は小文字

readonly CONSTANT_PARAM="hoge"
score=100

複数単語の場合は「名詞」と「名詞」を_で結合

readonly MAX_NUMBER=100

ローカル変数の先頭に_を付ける

function cal_score_ave() {
  local _score_sum=0
  # ...
}

ファイルおよびディレクトリの命名規則

  1. 末尾に/をつけない
  2. readonly宣言して定数にする
対象命名規則備考

|ファイル名(絶対パス) |HOGE_FILE| |ディレクトリ名(絶対パス) |HOGE_DIR| |ファイル名(パスなし) |HOGE_FILENAME| |ディレクトリ名(パスなし) |HOGE_DIRNAME| |# ファイル名(絶対パス)|readonly HOGE_FILE="/var/tmp/hoge.txt"| |# ディレクトリ名(絶対パス)|readonly HOGE_DIR="/var/tmp/hoge"| |# ファイル名(パスなし)|readonly HOGE_FILENAME="hoge.txt"| |# ディレクトリ名(パスなし)|readonly HOGE_DIRNAME="hoge"|

変数の宣言箇所

値を変更する可能性のある場合は冒頭に

  1. あとで値を変更する場合にわかりやすい 値を変更せず内部的に利用する場合は利用する箇所の直前に
  2. 変数と処理の関連性がわかりやすい

関数の命名規則

function宣言する

  1. 小文字で「動詞」と「名詞」を_で結合• usage()は例外
function cal_score_ave() {
  # ...
  return 0
}

関数は必ずreturnする

function cal_score_ave() {
  # ...
  return 0
}

リターンコード:正常終了は0、異常終了は0以外

パイプの前後に半角スペース1つ

CMD1 | CMD2

リダイレクトの前は半角スペース1つ、後はスペースなし

CMD1 >hoge.txt
CMD1 >>hoge.txt
CMD2 <fuga.txt
CMD2 <<fuga.txt

リダイレクトはグルーピングする

{
  echo "hoge"
  echo "fuga"
  echo "piyo"
} >>logfile.log

制御構文

if、thenは同一行に、セミコロンの後ろは半角スペース1つ

if [ $? -ne 0 ]; then
  # ...
  exit 1
fi

for、whileのdoとdoneを揃える

for _score in ${SCORE_ARRAY[@]}
do
  _score_sum=$((_score_sum + _score))
done

while IFS=$`\n` read _line
do
  echo $_line
done <hoge.txt

if文を省略しない

[ $hoge = $foo ] && echo "true" || echo "false"

参考情報1.シェルスクリプト Tips

  1. 2.bash によるオプション解析
  2. 3.逆引きシェルスクリプト/getoptsを利用して引数を取得する(bashビルドイン)

References

bashコーディング規約参考からリンク2年以上前

追加コメント

Bash, Zsh, Korn shellでしか使えませんが、[よりも[[のほうが一般的な演算子や正規表現が使えるのでオススメです。 http://mywiki.wooledge.org/BashFAQ/031

functionはBash・zshでしか使えないので追記をよろしくお願いします。この書き方で慣れてしまうとShebangが#!/bin/shのスクリプトに手を加えるときに少し面倒なことになります。(その場合はfunction抜きで書きます)


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS