/bin/sh
hoje em dia quase nunca é um shell Bourne em nenhum sistema (mesmo o Solaris, que foi um dos últimos grandes sistemas a incluí-lo, agora mudou para um POSIX sh para seu / bin / sh no Solaris 11). /bin/sh
foi a concha de Thompson no início dos anos 70. O shell Bourne o substituiu no Unix V7 em 1979.
/bin/sh
foi o shell Bourne por muitos anos depois (ou o shell Almquist, uma reimplementação gratuita nos BSDs).
Atualmente, /bin/sh
é mais comum um intérprete ou outro para a sh
linguagem POSIX , que se baseia em um subconjunto da linguagem ksh88 (e um superconjunto da linguagem shell Bourne com algumas incompatibilidades).
O shell Bourne ou a especificação de linguagem POSIX sh não suportam matrizes. Ou melhor, eles têm apenas uma matriz: os parâmetros de posição ( $1
, $2
, $@
, de modo que uma matriz por função, bem).
O ksh88 tinha matrizes com as quais você configurou set -A
, mas isso não foi especificado no sh POSIX, pois a sintaxe é estranha e pouco utilizável.
Outros conchas com variáveis de matriz / listas incluem: csh
/ tcsh
, rc
, es
, bash
(que na maior parte copiado a sintaxe ksh o caminho ksh93), yash
, zsh
, fish
cada um com uma sintaxe diferente ( rc
a casca de uma vez a-ser sucessor do Unix, fish
e zsh
ser o mais consistente uns)...
No padrão sh
(também funciona nas versões modernas do shell 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)
(observe que no shell Bourne e no ksh88, $IFS
deve conter o caractere de espaço para "$@"
funcionar corretamente (um bug) e, no shell Bourne, você não pode acessar os elementos acima $9
( ${10}
não funcionará, você ainda pode fazer shift 1; echo "$9"
ou fazer um loop) eles)).