達成したいことにアプローチする方法はいくつかあります。
1. $ BASH_VERSIONを使用します
$BASH_VERSION
変数の内容を確認するだけで十分です。個人的に私はサブシェルを次のように使用します:
$ (read -d "." version trash <<< $BASH_VERSION; echo "$version" )
4
<<<
here-docの構文/bin/sh
は、UbuntuのDashであるで使用する場合、移植性がないことに注意してください。
別の方法は、caseステートメントまたはifステートメントを使用する方法です。個人的に、私はこれを行います:
bash-4.3$ case $BASH_VERSION in 4.*) echo "Can use associative arrays";; ?) echo "can't use associative arrays" ;; esac
Can use associative arrays
おそらく移植性のために、おそらくそのような変数が最初にまったく設定されているかどうかを次のようなものでチェックする必要があります [ -n $BASH_VERSION ]
これは完全に、スクリプトで使用する関数として書き直すことができます。長いもの:
#!/bin/bash
version_above_4(){
# check if $BASH_VERSION is set at all
[ -z $BASH_VERSION ] && return 1
# If it's set, check the version
case $BASH_VERSION in
4.*) return 0 ;;
?) return 1;;
esac
}
if version_above_4
then
echo "Good"
else
echo "No good"
fi
これはワンライナーではありませんが、はるかに優れています。量より質。
2.インストールされているものを確認する
そのためには、そのapt-cache policy
ような出力をフィルタリングする必要があります
$ apt-cache policy bash | awk -F '[:.]' '/Installed:/{printf "%s\n",substr($2,2)}'
4
dpkg-query
を使用したフィルタリングでも便利awk
です。
$ dpkg-query -W bash | awk '{print substr($2,1,1)}'
4
これは移植性がないことに注意してください。システム(RHELやFreeBSDなど)がインストールされていないdpkg
かapt
、システムにインストールされていない場合は、何の役にも立ちません。
3.エラーが発生した場合は、set -eを使用してスクリプトを終了します
それを回避する1つの方法は、単に連想配列を使用し、使用bash
できないときに終了することです。set -e
下の行#!/bin/bash
は、スクリプトが連想配列を使用できない場合にスクリプトを終了できるようにします。
これには、ユーザーに明示的に伝える必要があります:「ねえ、本当にbashバージョン4.3以降が必要です。そうしないと、スクリプトは機能しません」。それから責任はユーザーにありますが、これはソフトウェア開発への良いアプローチではないと主張する人もいます。
4.すべての希望を捨て、移植可能なPOSIX準拠のスクリプトを作成する
bash
スクリプトの構文はBourneシェルと互換性がないため、スクリプトは移植できません。作成しているスクリプトが、Ubuntuだけでなく、さまざまなシステムで使用される場合は、すべての希望を放棄し、連想配列以外のものを使用する方法を見つけてください。これには、2つの配列を持つことや、構成ファイルの解析が含まれる場合があります。構文が少なくともと比較して移植性が高い別の言語であるPerlまたはPythonに切り替えることも検討してくださいbash
。
$BASH_VERSION
し、$BASH_VERSINFO
変数?