Matrices Bash

Aquí hay una traducción de " Bash Arrays " de Mitch Frazier de linuxjournal.com.



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



All Articles