Si está utilizando el shell "estándar" * NIX, es posible que no esté familiarizado con la útil función bash de las matrices. Si bien las matrices en bash no son tan interesantes como en los lenguajes P (Perl, Python y PHP) y otros lenguajes de programación, a menudo son útiles.
Las matrices Bash solo tienen índices numéricos, pero son opcionales, es decir, no es necesario definir explícitamente los valores de todos los índices. Se puede definir una matriz completa encerrando las entradas entre paréntesis:
arr=(Hello World)
Los registros individuales se pueden definir utilizando la sintaxis familiar (desde BASIC (perdóname Dijkstra - nota del traductor) hasta Fortran):
arr[0]=Hello
arr[1]=World
Sin embargo, lo contrario se ve comparativamente más feo. Si necesita hacer referencia a una entrada específica, entonces:
echo ${arr[0]} ${arr[1]}
De la página del manual:
" Se necesitan llaves para evitar conflictos al expandir las rutas completas a los archivos " .
Además, están disponibles las siguientes construcciones extrañas:
${arr[*]} #
${!arr[*]}#
${#arr[*]}#
${#arr[0]}# ( )
$ {! arr [*]} es una adición relativamente nueva a bash y no es parte de la implementación original. La siguiente construcción muestra un ejemplo de un uso simple de una matriz. Tenga en cuenta el "[índice] = valor", esto le permite asignar un valor específico a un número de registro específico.
#!/bin/bash
array=(one two three four [5]=five)
echo "Array size: ${#array[*]}" #
echo "Array items:" #
for item in ${array[*]}
do
printf " %s\n" $item
done
echo "Array indexes:" #
for index in ${!array[*]}
do
printf " %d\n" $index
done
echo "Array items and indexes:" #
for index in ${!array[*]}
do
printf "%4d: %s\n" $index ${array[$index]}
done
La ejecución del script generará la siguiente salida:
Tamaño de la matriz: 5
Elementos de la matriz:
uno
dos
tres
cuatro
cinco
Índices de la matriz:
0
1
2
3
5
Índices y elementos de la matriz:
0: uno
1: dos
2: tres
3: cuatro
5: cinco
Tenga en cuenta que el carácter "@" se puede usar en lugar de "*" en construcciones como {arr [*]}, el resultado será el mismo excepto por la expansión de la entrada entre comillas. "$ *" y "$ @" generarán entradas entre comillas, "$ {arr [*]}" devolverá cada entrada como una palabra, "$ {arr [@]}" devolverá cada entrada como palabras separadas.
El siguiente ejemplo mostrará cómo las comillas y las construcciones sin comillas devuelven cadenas (especialmente importante cuando estas cadenas contienen espacios):
#!/bin/bash
array=("first item" "second item" "third" "item")
echo "Number of items in original array: ${#array[*]}"
for ix in ${!array[*]}
do
printf " %s\n" "${array[$ix]}"
done
echo
arr=(${array[*]})
echo "After unquoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
printf " %s\n" "${arr[$ix]}"
done
echo
arr=("${array[*]}")
echo "After * quoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
printf " %s\n" "${arr[$ix]}"
done
echo
arr=("${array[@]}")
echo "After @ quoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
printf " %s\n" "${arr[$ix]}"
done
Salida al inicio:
Número de elementos en la matriz original: 4
primer elemento
segundo elemento
tercer
elemento
Después de la expansión no entre comillas: 6
primer
elemento
segundo
elemento
tercer
elemento
Después de * expansión citada: 1
primer elemento segundo elemento tercer elemento
Después de la expansión @ citada: 4
primer elemento
segundo artículo
tercer
artículo