shell : convert string to array
<<<
is a zsh operator now supported by a few other shells (including bash
).
read -a
is bash-specific. ksh had read -A
for that long before bash (consistent with set -A
; set -a
being something else inherited from the Bourne shell; also supported by zsh
and yash
)
sh
these days is an implementation or another of an interpreter for the POSIX sh
language. That language has neither <<<
nor read -a
nor arrays (other than "$@"
).
On Ubuntu, by default, the shell used as sh
interpreter is dash
which is very close to the POSIX sh
specification in that it implements very few extensions over what POSIX specifies. It implements none of <<<
, read -a
nor arrays.
In POSIX sh
, to split a string into the one POSIX sh
array ("$@"
), you'd use:
IFS=. # split on .
set -o noglob # disable glob
set -- $VERSION"" # split+glob with glob disabled.
echo "$# elements:"
printf ' - "%s"\n' "$@"
It has a few advantages over the bash-specific IFS=. read -a <<< $string
syntax:
- it doesn't need creating a temporary file and storing the contents of
$string
in it. - it works even if
$string
contains newline characters (read -a <<< $string
) would only read the first line. - it works even if
$string
contains backslash characters (withread
, you need the-r
option for backslash not to undergo a special processing). - it's standard.
- it works for values like
1.2.
.read -a <<< $string
would split it into"1"
and"2"
only instead of"1"
,"2"
and""
. - in older versions of
bash
, you had to quote the$string
(IFS=. read -ra <<< "$string"
) or otherwise it would undergo splitting (followed by joining with space).
You're hashbang is /bin/sh
and you are running the script with sh
, which does not support the <<<
herestring. If you use /bin/bash
it will work.
Additionally, while /bin/sh
often supports arrays it is not required to do so, if an array is required you should use ksh
, bash
, zsh
, or another shell that has support for them.