/bin/sh
w dzisiejszych czasach prawie nigdy nie jest powłoką Bourne'a (nawet Solaris, który był jednym z ostatnich głównych systemów w tym zakresie, teraz przeszedł na POSIX sh dla swojego / bin / sh w Solaris 11). /bin/sh
był pocisk Thompson na początku lat 70. Powłoka Bourne zastąpiła ją w Unix V7 w 1979 r.
/bin/sh
od wielu lat jest powłoką Bourne'a (lub powłoką Almquist, bezpłatna reimplementacja BSD).
Obecnie /bin/sh
częściej jest tłumaczem lub innym sh
językiem POSIX , który sam jest oparty na podzbiorze języka ksh88 (i nadzbiór języka powłoki Bourne'a z pewnymi niezgodnościami).
Powłoka Bourne'a lub specyfikacja języka sh POSIX nie obsługują tablic. Albo raczej, że mają tylko jedną tablicę: parametry pozycyjne ( $1
, $2
, $@
, więc na jednej tablicy funkcji, jak również).
ksh88 miał tablice, które ustawiłeś set -A
, ale nie zostały one określone w POSIX sh, ponieważ składnia jest niewygodna i niezbyt użyteczna.
Inne pociski z tablicy / list zmiennych są: csh
/ tcsh
, rc
, es
, bash
(które najczęściej kopiowane składnię KSH sposób ksh93) yash
, zsh
, fish
każdy z innym składni ( rc
powłoce raz do następcą Unix, fish
i zsh
jest najbardziej zgodne te) ...
Standardowo sh
(działa również w nowoczesnych wersjach powłoki Bourne'a):
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)
(zwróć uwagę, że w powłoce Bourne'a i ksh88 $IFS
musi zawierać znak spacji, "$@"
aby działał poprawnie (błąd), aw powłoce Bourne'a nie możesz uzyskać dostępu do elementów powyżej $9
( ${10}
nie będzie działać, nadal możesz to zrobić shift 1; echo "$9"
lub zapętlić im)).