GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Arrays in der Unix-Bourne-Shell?

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)).

Verwandte:Speichert $SHELL den Pfad zur Standard-Shell in Linux?
Linux
  1. 4 Möglichkeiten zum Ausführen eines Shell-Skripts unter UNIX / Linux

  2. 3 Unix-Shell-Skripte – Benutzeraktivität, Prozesse anzeigen, Speicher anzeigen

  3. Wie kann ich Dateien aus einem UNIX-Shell-Skript per FTP übertragen und herunterladen?

  4. UNIX / Linux:Was ist eine Shell? Was sind verschiedene Muscheln?

  5. Wie führe ich ein Shell-Skript auf einer Unix-Konsole oder einem Mac-Terminal aus?

SDF bietet allen ein kostenloses Unix-Shell-Konto und Shell-Zugriff

Linux gegen Unix

Arrays in Shell-Skripten

Addieren Sie eine Spalte mit Zahlen in der Unix-Shell

Hinzufügen von Zeilenumbrüchen zu Unix-Shell-Variablen

Welchen Umfang haben exportierte Unix-Shell-Variablen?