/bin/sh
al giorno d'oggi non è quasi mai una shell Bourne su alcun sistema (anche Solaris, che è stato uno degli ultimi sistemi principali ad includere, è ora passato a un POSIX sh per il suo / bin / sh in Solaris 11). /bin/sh
era la conchiglia Thompson nei primi anni '70. La shell Bourne lo sostituì in Unix V7 nel 1979.
/bin/sh
è stata la shell Bourne per molti anni in seguito (o la shell Almquist, una reimplementazione gratuita su BSD).
Al giorno d'oggi, /bin/sh
è più comunemente un interprete o un altro per il sh
linguaggio POSIX che è esso stesso basato su un sottoinsieme del linguaggio di ksh88 (e un superset del linguaggio shell Bourne con alcune incompatibilità).
La shell Bourne o la specifica del linguaggio sh POSIX non supportano gli array. Anzi hanno solo una matrice: i parametri posizionali ( $1
, $2
, $@
, quindi un array per funzione pure).
ksh88 aveva array con cui si impostava set -A
, ma ciò non è stato specificato in POSIX sh poiché la sintassi è scomoda e non molto utilizzabile.
Altre shell con variabili di campo / elenchi includono: csh
/ tcsh
, rc
, es
, bash
(che in gran parte copiata la sintassi ksh modo ksh93), yash
, zsh
, fish
ciascuno con una sintassi diversa ( rc
il guscio della volta per-be successore di Unix, fish
ed zsh
essendo la più coerente quelli ...)
In standard sh
(funziona anche nelle versioni moderne della shell Bourne):
set '1st element' 2 3 # setting the array
set -- "$@" more # adding elements to the end of the array
shift 2 # removing elements (here 2) from the beginning of the array
printf '<%s>\n' "$@" # passing all the elements of the $@ array
# as arguments to a command
for i do # looping over the elements of the $@ array ($1, $2...)
printf 'Looping over "%s"\n' "$i"
done
printf '%s\n' "$1" # accessing individual element of the array.
# up to the 9th only with the Bourne shell though
# (only the Bourne shell), and note that you need
# the braces (as in "${10}") past the 9th in other
# shells.
printf '%s\n' "$# elements in the array"
printf '%s\n' "$*" # join the elements of the array with the
# first character (byte in some implementations)
# of $IFS (not in the Bourne shell where it's on
# space instead regardless of the value of $IFS)
(nota che nella shell Bourne e ksh88, $IFS
deve contenere il carattere spazio per "$@"
funzionare correttamente (un bug), e nella shell Bourne, non puoi accedere agli elementi sopra $9
( ${10}
non funzionerà, puoi comunque fare shift 1; echo "$9"
o passare sopra loro)).