/bin/sh
В настоящее время вряд ли когда-либо будет оболочкой Bourne в каких-либо системах (даже Solaris, которая была одной из последних крупных систем, включившей ее, теперь переключилась на POSIX sh для своего / bin / sh в Solaris 11). /bin/sh
была оболочкой Томпсона в начале 70-х годов. Оболочка Bourne заменила ее в Unix V7 в 1979 году.
/bin/sh
в течение многих лет после этого была оболочкой Борна (или оболочкой Альмквиста, бесплатной повторной реализацией на BSD).
В настоящее время /bin/sh
чаще используется тот или иной интерпретатор для sh
языка POSIX, который сам основан на подмножестве языка ksh88 (и расширенном наборе языка оболочки Bourne с некоторыми несовместимостями).
Оболочка Bourne или спецификация языка POSIX sh не поддерживают массивы. Или , скорее , они имеют только один массив: позиционные параметры ( $1
, $2
, $@
, так что один массив на функцию, а).
У ksh88 были массивы, которые вы установили set -A
, но они не были указаны в POSIX sh, поскольку синтаксис неудобен и не очень удобен.
Другие оболочки с массивами / списками переменных включают в себя: csh
/ tcsh
, rc
, es
, bash
(которые в основном скопированы с синтаксисом КШ в ksh93 пути), yash
, zsh
, fish
каждый с другим синтаксисом ( rc
оболочкой один раз-быть преемник Unix, fish
и zsh
являются наиболее последовательными из них) ...
В стандартной комплектации sh
(также работает в современных версиях оболочки Bourne):
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)
(обратите внимание, что в оболочке Bourne и ksh88, $IFS
должен содержать символ пробела для "$@"
правильной работы (ошибка), а в оболочке Bourne вы не можете получить доступ к элементам выше $9
( ${10}
не будет работать, вы все равно можете сделать shift 1; echo "$9"
или перебрать их)).