GNU/Linux >> Znalost Linux >  >> Linux

Pole v Unix Bourne Shell?

Snažím se používat pole v Bourne shellu (/bin/sh ). Zjistil jsem, že způsob inicializace prvků pole je:

arr=(1 2 3)

Ale dochází k chybě:

syntax error at line 8: `arr=' unexpected

Nyní příspěvek, kde jsem našel tuto syntaxi, říká, že je pro bash , ale nemohl jsem najít žádnou samostatnou syntaxi pro Bourne shell. Je syntaxe stejná pro /bin/sh také?

Přijatá odpověď:

/bin/sh je v dnešní době stěží Bourne shell na jakémkoli systému (dokonce i Solaris, který byl jedním z posledních velkých systémů, který jej obsahoval, nyní přešel na POSIX sh pro svůj /bin/sh v Solaris 11). /bin/sh byl Thompsonův granát na počátku 70. let. Bourne shell jej nahradil v Unixu V7 v roce 1979.

/bin/sh byl Bourne shell po mnoho let poté (nebo Almquist shell, bezplatná reimplementace na BSD).

V současné době /bin/sh je více obyčejně interpret nebo jiný pro POSIX sh jazyk, který je sám o sobě založen na podmnožině jazyka ksh88 (a nadmnožině jazyka Bourne shell s některými nekompatibilitami).

Bourne shell nebo specifikace jazyka POSIX sh nepodporují pole. Nebo spíše mají pouze jedno pole:poziční parametry ($1 , $2 , [email protected] , takže také jedno pole na funkci).

ksh88 měl pole, která jste nastavili pomocí set -A , ale to nebylo specifikováno v POSIX sh, protože syntaxe je nešikovná a málo použitelná.

Mezi další shelly s proměnnými pole/seznamy patří:csh /tcsh , rc , es , bash (který většinou kopíroval syntaxi ksh způsobem ksh93), yash , zsh , fish každý s jinou syntaxí (rc shell kdysi budoucího nástupce Unixu, fish a zsh jsou nejdůslednější)…

Ve standardním sh (funguje také v moderních verzích Bourne shellu):

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)

(všimněte si, že v Bourne shell a ksh88, $IFS musí obsahovat znak mezery pro "[email protected]" správně fungovat (chyba) a v Bourne shellu nemáte přístup k prvkům nad $9 (${10} nebude fungovat, stále můžete provést shift 1; echo "$9" nebo přes ně smyčka)).

Související:Ukládá $SHELL cestu k výchozímu shellu v Linuxu?
Linux
  1. Tipy pro Unix Shell:Změňte přihlašovací shell z Bash na jiné

  2. TMOUT – Automaticky ukončí Unix Shell, když není žádná aktivita

  3. UNIX / Linux:Co je to Shell? Jaké jsou různé Shelly?

  1. Jak spustit skript shellu na konzole Unix nebo terminálu Mac?

  2. Jak trvale nastavit $PATH na Linux/Unix?

  3. Jaký je rozsah exportovaných proměnných shellu Unix?

  1. Asociativní pole ve skriptech Shell?

  2. Je Mac Os X Unix?

  3. Použití kláves Vi k úpravě příkazů Shell v Unixu?