/bin/sh
ist heutzutage auf keinem System mehr eine Bourne-Shell (selbst Solaris, das als eines der letzten großen Systeme einbezogen wurde, hat in Solaris 11 für / bin / sh auf POSIX sh umgestellt). /bin/sh
war die Thompson-Shell in den frühen 70er Jahren. Die Bourne-Shell ersetzte sie 1979 in Unix V7.
/bin/sh
ist seit vielen Jahren die Bourne-Shell (oder die Almquist-Shell, eine kostenlose Neuimplementierung von BSDs).
Heutzutage /bin/sh
ist eher ein Dolmetscher oder ein anderer für die POSIXsh
Sprache, der selbst auf einer Teilmenge der Sprache von ksh88 (und einer Obermenge der Bourne-Shell-Sprache mit einigen Inkompatibilitäten) basiert.
Die Bourne-Shell oder die POSIX-Sprachspezifikation unterstützen keine Arrays. Oder besser gesagt sie haben nur ein Array: die Positionsparameter ( $1
, $2
,$@
, so ein Array pro Funktion als auch).
ksh88 hatte Arrays, die Sie eingestellt haben set -A
, aber diese wurden in POSIX sh nicht angegeben, da die Syntax umständlich und wenig benutzerfreundlich ist.
Andere Schalen mit Array / Listen Variablen umfassen: csh
/ tcsh
, rc
, es
, bash
(was meistens der KSH Syntax der ksh93 Weise kopiert), yash
, zsh
, die fish
jeweils mit einer anderen Syntax ( rc
die Schale des einmal zu-sein Nachfolger von Unix, fish
und zsh
wobei die beständigsten Einsen)...
Standardmäßig sh
(funktioniert auch in modernen Versionen der Bourne-Shell):
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)
(Beachten Sie, dass in der Bourne-Shell und in ksh88 $IFS
das Leerzeichen enthalten sein muss "$@"
, damit es ordnungsgemäß funktioniert (ein Fehler), und dass Sie in der Bourne-Shell nicht auf die obigen Elemente zugreifen können $9
( ${10}
nicht funktionieren, Sie können immer noch eine shift 1; echo "$9"
Schleife ausführen oder einen Loop ausführen) Sie)).