There's couple ways to approach what you want to achieve.
1. Use $BASH_VERSION
It's sufficient to just to see what's in $BASH_VERSION
variable. Personally I'd use subshell like so:
$ (read -d "." version trash <<< $BASH_VERSION; echo "$version" )
4
Note that <<<
syntax for here-doc is not portable, if you're going to use it with /bin/sh
, which is Dash on Ubuntu and might be something else on a different system
Alternative way is via case statement or if statement. Personally, I'd do this:
bash-4.3$ case $BASH_VERSION in 4.*) echo "Can use associative arrays";; ?) echo "can't use associative arrays" ;; esac
Can use associative arrays
Probably for the sake of portability , you probably should check if such variable is even set at all in the first place with something like [ -n $BASH_VERSION ]
This totally can be rewritten as function to be used in a script. Something a long the lines of:
#!/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
This is not a one-liner, although this is much better. Quality over quantity.
2. Check what's installed
For that you need to filter output of apt-cache policy
like so
$ apt-cache policy bash | awk -F '[:.]' '/Installed:/{printf "%s\n",substr($2,2)}'
4
dpkg-query
can also come in handy with some filtering via awk
.
$ dpkg-query -W bash | awk '{print substr($2,1,1)}'
4
Note that this is not portable, since if there's no dpkg
or apt
installed on a system ( for instance, RHEL or FreeBSD ), it won't do you any good.
3. Use set -e to exit script if there's an error
One way to get around it is just simply go ahead an use associative arrays and quit when bash
cannot use them. set -e
line below #!/bin/bash
will allow the script to quit if the script can't use associative array.
This will require you to explicitly tell the user: "Hey, you really need bash version 4.3 or above, otherwise the script won't work". Then the responsibility rests with the user, although some might argue that this is not really a good approach to software development.
4. Abandon all hope and write portable, POSIX-compliant scripts
bash
scripts aren't portable because its syntax isn't compatible with Bourne shell. If the script that you're writing is going to be used on a range of different systems, not just Ubuntu alone, then abandon all hope, and find ways to use something other than associative arrays. That might include having two arrays or parsing a configuration file. Consider also switching to a different language, Perl or Python, where syntax is at least more portable than bash
.
$BASH_VERSION
and$BASH_VERSINFO
variables?--version
and testing the output was the original intention. I've edited the question accordingly.