Bash >=4.0 を検出するにはどうすればいいですか?

Bash >=4.0 を検出するにはどうすればいいですか?

を使用するスクリプトを作成しているread -iため、Bash 4.0 以降が必要です。

残念ながら、2020 年初頭の時点で、macOS にはまだ Bash 3.x が同梱されており、私のスクリプトのユーザーの多くは Mac を使用しています。Apple がデフォルトのシェルを zsh に変更したため、バンドル バージョンが更新される見込みはありません。

そのため、スクリプトで Bash が十分に新しいかどうかを検出し、ユーザーにアップグレードを指示する役立つエラー メッセージを表示して終了するようにします。

を比較できることはわかっています${BASH_VERSION}が、これは数値ではない、信頼できない可能性のある形式の文字列です。それについて仮定を立てるのは不安定な気がします。

これを実現するための最善の方法は何でしょうか?

requireBash4() {
  if <something here>; then
    >&2 echo "Bash 4.0 or newer is required."
    >&2 echo "Once you're upgraded, re-run this script."
    exit 1
  fi
}

答え1

if ((BASH_VERSINFO >= 4)); then ...

は配列であることに注意してくださいBASH_VERSINFO。bash のどの配列でも、これを単純な変数として使用すると、0 番目の要素が参照されます。((BASH_VERSINFO[0] >= 4))よりわかりやすい場合は、 を使用することもできます。

はい、この変数と構文は少なくとも bash 2.0 以降でサポートされています。

BASH_VERSINFO

メンバーにこの bash インスタンスのバージョン情報を保持する読み取り専用配列変数。配列メンバーに割り当てられる値は次のとおりです。

BASH_VERSINFO[0] メジャー バージョン番号 (リリース)。
BASH_VERSINFO[1] マイナー バージョン番号 (バージョン)。
BASH_VERSINFO[2] パッチ レベル。
BASH_VERSINFO[3] ビルド バージョン。
BASH_VERSINFO[4] リリース ステータス (例: beta1)。
BASH_VERSINFO[5] の値MACHTYPE

関連情報