Ich versuche, Arrays in der Bourne-Shell zu verwenden (/bin/sh
). Ich habe festgestellt, dass der Weg zum Initialisieren von Array-Elementen folgendermaßen ist:
arr=(1 2 3)
Aber es tritt ein Fehler auf:
syntax error at line 8: `arr=' unexpected
Jetzt sagt der Beitrag, in dem ich diese Syntax gefunden habe, dass sie für bash
ist , aber ich konnte keine separate Syntax für die Bourne-Shell finden. Ist die Syntax für /bin/sh
gleich auch?
Akzeptierte Antwort:
/bin/sh
ist heutzutage kaum noch eine Bourne-Shell auf Systemen (selbst Solaris, das eines der letzten großen Systeme war, das es enthielt, ist jetzt in Solaris 11 zu einem POSIX sh für sein /bin/sh gewechselt). /bin/sh
war die Thompson-Shell in den frühen 70er Jahren. Die Bourne-Shell ersetzte sie 1979 in Unix V7.
/bin/sh
war danach viele Jahre lang die Bourne-Shell (oder die Almquist-Shell, eine freie Neuimplementierung auf BSDs).
Heutzutage /bin/sh
ist häufiger ein Interpreter oder ein anderer für den POSIX sh
Sprache, die selbst auf einer Teilmenge der Sprache von ksh88 basiert (und einer Obermenge der Bourne-Shell-Sprache mit einigen Inkompatibilitäten).
Die Bourne-Shell oder die POSIX-sh-Sprachspezifikation unterstützen keine Arrays. Oder besser gesagt, sie haben nur ein Array:die Positionsparameter ($1
, $2
, [email protected]
, also auch ein Array pro Funktion).
ksh88 hatte Arrays, die Sie mit set -A
gesetzt haben , aber das wurde nicht in der POSIX sh angegeben, da die Syntax umständlich und nicht sehr brauchbar ist.
Andere Shells mit Array-/Listen-Variablen sind:csh
/tcsh
, rc
, es
, bash
(die meistens die ksh-Syntax auf ksh93-Weise kopierten), yash
, zsh
, fish
jeweils mit einer anderen Syntax (rc
die Shell des einstigen Unix-Nachfolgers fish
und zsh
die beständigsten sind)…
Im Standard-sh
(funktioniert auch in modernen Versionen der Bourne-Shell):
set '1st element' 2 3 # setting the array
set -- "[email protected]" more # adding elements to the end of the array
shift 2 # removing elements (here 2) from the beginning of the array
printf '<%s>n' "[email protected]" # passing all the elements of the [email protected] array
# as arguments to a command
for i do # looping over the elements of the [email protected] array ($1, $2...)
printf 'Looping over "%s"n' "$i"
done
printf '%sn' "$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 (except zsh, when not in sh emulation and
# most ash-based shells).
printf '%sn' "$# elements in the array"
printf '%sn' "$*" # 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 ksh88 $IFS
muss das Leerzeichen für "[email protected]"
enthalten nicht richtig funktioniert (ein Fehler), und in der Bourne-Shell können Sie nicht auf Elemente über $9
zugreifen (${10}
funktioniert nicht, du kannst immer noch shift 1; echo "$9"
oder überschleifen)).