/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"
або перебирати цикл на їх)).