Estoy tratando de usar matrices en Bourne shell ( /bin/sh
). Descubrí que la forma de inicializar los elementos de la matriz es:
arr=(1 2 3)
Pero se encuentra con un error:
syntax error at line 8: `arr=' unexpected
Ahora, la publicación donde encontré esta sintaxis dice que es para bash
, pero no pude encontrar ninguna sintaxis separada para el shell Bourne. ¿La sintaxis también es la misma /bin/sh
?
shell
array
bourne-shell
SubhasisM
fuente
fuente
Respuestas:
/bin/sh
Casi nunca es un shell Bourne en ningún sistema hoy en día (incluso Solaris, que fue uno de los últimos sistemas importantes en incluirlo, ahora ha cambiado a POSIX sh por su / bin / sh en Solaris 11)./bin/sh
fue la concha de Thompson a principios de los 70 El shell Bourne lo reemplazó en Unix V7 en 1979./bin/sh
ha sido el shell Bourne durante muchos años a partir de entonces (o el shell Almquist, una reimplementación gratuita en BSD).Hoy en día,
/bin/sh
es más comúnmente un intérprete u otro para elsh
lenguaje POSIX que se basa en un subconjunto del lenguaje de ksh88 (y un superconjunto del lenguaje shell Bourne con algunas incompatibilidades).El shell Bourne o la especificación del lenguaje POSIX sh no admiten matrices. O, más bien que sólo tienen una matriz: los parámetros posicionales (
$1
,$2
,$@
, por lo que una matriz por la función, así).ksh88 tenía matrices con las que configuró
set -A
, pero eso no se especificó en POSIX sh ya que la sintaxis es incómoda y no muy utilizable.Otros conchas con variables de matriz / listas incluyen:
csh
/tcsh
,rc
,es
,bash
(que en su mayoría copiado la sintaxis ksh la forma ksh93),yash
,zsh
,fish
cada uno con una sintaxis diferente (rc
la cáscara de la vez sea-sucesor de Unix,fish
yzsh
siendo el más consistente unos) ...En estándar
sh
(también funciona en versiones modernas del shell Bourne):(tenga en cuenta que en el shell Bourne y ksh88,
$IFS
debe contener el carácter de espacio para"$@"
que funcione correctamente (un error), y en el shell Bourne, no puede acceder a los elementos anteriores$9
(${10}
no funcionará, aún puede hacershift 1; echo "$9"
o recorrer) ellos)).fuente
"${@:2:4}"
. Para estar seguro, veo las similitudes , pero no considero los parámetros posicionales como una matriz per se."$@"
actúa como una matriz (como las matrices decsh
,rc
,zsh
,fish
,yash
...), es más los Korn / bash "conjuntos" que no son realmente matrices, pero algunos forma de matrices asociativas con claves limitadas a enteros positivos (también tienen índices que comienzan en 0 en lugar de 1 como en todos los demás shells con matrices y "$ @"). Los shells que tienen soporte para segmentar pueden dividir $ @ de la misma manera (con ksh93 / bash agregando torpemente $ 0 a los parámetros posicionales cuando se divide "$ @").No hay matrices en el shell Bourne simple. Puede usar la siguiente forma para crear una matriz y recorrerla:
No importa en qué forma utilizar matrices
sh
, si elige, siempre será engorroso. Considere usar un idioma diferente, comoPython
oPerl
si puede, a menos que esté atrapado en una plataforma muy limitada o quiera aprender algo.fuente
$(...)
sintaxis. Por lo tanto, debe tener el shell Bourne. ¿Estás en Solaris 10 o antes? Lo más probable es que tampoco tengasseq
uno. En Solaris 10 y versiones anteriores, desea que / usr / xpg4 / bin / sh tenga un estándar ensh
lugar de un shell Bourne. Usarseq
ese camino tampoco es muy bueno.seq
no es bueno usar de esa manera?$(...)
más`
, pero el PO de/bin/sh
es probablemente una cáscara de Bourne, no un shell POSIX. Además deseq
no ser un comando estándar, hacerlo$(seq 100)
significa almacenar toda la salida en la memoria, y eso significa que depende del valor actual de $ IFS que contiene nueva línea y no contiene dígitos. Mejor usari=1; while [ "$i" -le 100 ]; ...; i=$(($i + 1)); done
(aunque eso tampoco funcionaría en el shell Bourne)./bin/sh
sintaxis portátil , tiende a hacer que la gente piense que está bien usar el#!/bin/sh
shebang incorrecto , y luego rompe sus scripts cuando otras personas intentan usarlos. Se recomienda no publicar este tipo de cebo de llama. :)Como han dicho los demás, Bourne Shell no tiene matrices verdaderas .
Sin embargo, dependiendo de lo que necesite hacer, las cadenas delimitadas deberían ser suficientes:
Si los delimitadores típicos (espacio, tabulación y nueva línea) no son suficientes, puede establecer el
IFS
delimitador que desee antes del bucle.Y si necesita compilar la matriz mediante programación, puede crear una cadena delimitada.
fuente
split+glob
operador).Una forma de simular matrices en el tablero (se puede adaptar para cualquier cantidad de dimensiones de una matriz): (Tenga en cuenta que el uso del
seq
comando requiere queIFS
esté configurado en '' (ESPACIO = el valor predeterminado). Puede usarwhile ... do ...
odo ... while ...
bucles en su lugar para evitar esto (mantuveseq
en el alcance de una mejor ilustración de lo que hace el código).fuente
local
es compatible con ambosbash
ydash
no es POSIX.seq
tampoco es un comando POSIX. Probablemente debería mencionar que su código hace algunas suposiciones sobre el valor actual de $ IFS (si evita usarseq
y cotiza sus variables, se puede evitar)