現場で使えるシェルスクリプト入門3 定数の宣言

シェルスクリプト IT

シェルスクリプトには、他の言語にあるような「仕様として保護された定数」は存在しません。
環境変数や定数として扱うときは 大文字(UPPER_CASE) で書くのが一般的です。
定数が必要になる理由として、例えば次のような点があります。

  • 設定値(パス、URL、保持日数など)を一箇所にまとめられる
  • 誤って上書きする事故を防げる
  • スクリプトの前提条件が明確になる
  • 他の人が読んだときに意図が伝わりやすい

多くの言語と同じく、スクリプト冒頭に定数をまとめるのが慣習です。
定数は慣習として大文字にするとはいえ、以下宣言だと変数として再代入できてしまいます。

BACKUP_DIR="/backup"
RETENTION_DAYS=7
LOG_FILE="/var/log/myapp.log"

再代入を防ぐにはreadonlyコマンド、もしくはdeclare -rを使用し、値を読み取り専用にする必要があります。
readonly / declare -r を使うと、再代入時にエラーメッセージが出力され、代入は失敗します。

readonly

readonlyはPOSIX互換性があり、bash以外のシェルでも動きます。
異なるUNIX系OSやシェルを扱うマルチな環境でシェルスクリプトを動かす場合に有利です。

readonly BACKUP_DIR="/backup"
readonly RETENTION_DAYS=7
readonly LOG_FILE="/var/log/myapp.log"

declare -r

declareはbashの組み込みコマンドで、POSIX sh(標準的な /bin/sh 互換シェル)では使用できません。
ここでは詳細を記載しませんが、declareは変数に属性(整数型・連想配列・readonly など)を持たせる効果があり、-rオプションを付けて宣言するとreadonlyと同じく読み取り専用になります。

declare -r BACKUP_DIR="/backup"
declare -r RETENTION_DAYS=7
declare -r LOG_FILE="/var/log/myapp.log"

移植性を重視するならreadonly、bash前提で記述を統一するならdeclare -r が使いやすいでしょう。

コメント

タイトルとURLをコピーしました