/bin/sh
n'est presque jamais un shell Bourne sur aucun système de nos jours (même Solaris qui était l'un des derniers systèmes majeurs à l'inclure est maintenant passé à un POSIX sh pour son / bin / sh dans Solaris 11). /bin/sh
était l'obus Thompson au début des années 70. Le shell Bourne l'a remplacé dans Unix V7 en 1979.
/bin/sh
a été le shell Bourne pendant de nombreuses années par la suite (ou le shell Almquist, une réimplémentation gratuite sur les BSD).
De nos jours, /bin/sh
est plus communément un interprète ou un autre pour le sh
langage POSIX qui est lui-même basé sur un sous-ensemble du langage de ksh88 (et un sur-ensemble du langage shell Bourne avec quelques incompatibilités).
Le shell Bourne ou la spécification du langage POSIX sh ne prennent pas en charge les tableaux. Ou plutôt ils ont seulement un tableau: les paramètres de position ( $1
, $2
, $@
, donc une matrice par fonction ainsi).
ksh88 avait des tableaux avec lesquels vous définissez set -A
, mais qui n'ont pas été spécifiés dans le POSIX sh car la syntaxe est maladroite et peu utilisable.
D' autres coquilles avec des variables tableau / listes comprennent: csh
/ tcsh
, rc
, es
, bash
(qui la plupart du temps copié la syntaxe ksh la façon dont ksh93), yash
, zsh
, fish
chacun avec une syntaxe différente ( rc
la coque de la fois à être le successeur d'Unix, fish
et zsh
étant la plus cohérente ceux) ...
En standard sh
(fonctionne également dans les versions modernes du 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)
(notez que dans le shell Bourne et ksh88, $IFS
doit contenir le caractère espace pour "$@"
fonctionner correctement (un bug), et dans le shell Bourne, vous ne pouvez pas accéder aux éléments ci-dessus $9
( ${10}
ne fonctionnera pas, vous pouvez toujours faire shift 1; echo "$9"
ou boucler leur)).