
を使用するスクリプトを作成している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
。