Como usar um array de strings no bash

1

Eu escrevo o seguinte script

função load deve definir o array disk[a]=1 e disk[b]=2 e assim por diante

Em seguida, a saída da função deve imprimir a matriz ${disk[a]} e ${disk[b]} e assim por diante

Mas o que obtemos da função out é sempre o número 4

Em vez disso, quero receber o seguinte:

1
2
3
4

O que está errado aqui?

Como corrigir isso, a função será impressa:

1
2
3
4

o script:

#!/bin/bash

function load
{
  counter=1
  for input in a b c d
  do
    disk[$input]=$counter
    let counter=$counter+1
    echo ${disk[$input]}
  done
}


function out
{
  counter=1
  for input in  a b c d
  do
    echo ${disk[$input]}
    let counter=$counter+1
  done
}

echo "run function load"
load
echo "run function out"
out

a saída:

./test
run function load
1
2
3
4
run function out
4
4
4
4
    
por yael 01.11.2018 / 18:18

2 respostas

5

Matrizes Bash são matrizes indexadas por padrão:

An indexed array is created automatically if any variable is assigned to using the syntax name[subscript]=value

... mas você está usando letras como o índice, então você provavelmente quer um array associativo, o que significa que você precisa de um:

declare -A disk

antes de chamar as funções.

    
por 01.11.2018 / 18:29
5

Veja o que acontece com o array ao inicializá-lo:

$ i=0; for k in a b c d; do A[$k]=$((i++)); done; declare -p A
declare -a A=([0]="3")

Apenas um elemento está presente e tem o índice zero.

Por padrão, os arrays são indexados por números , e os valores numéricos dos índices que você usou eram todos zero. Na verdade, em um contexto aritmético, como o índice de uma matriz regular, uma string é tomada como o nome de uma variável e o valor dessa variável é usado. Então, se definirmos a , b ... para números, então obteremos algo diferente:

$ a=123; b=456; c=789; d=999; i=0;
$ for k in a b c d; do A[$k]=$((i++)); done;
$ declare -p A
declare -a A=([123]="0" [456]="1" [789]="2" [999]="3")

Para realmente usar as próprias strings como índices, declare a matriz como uma matriz associativa primeiro com declare -A arrayname ou typeset -A arrayname :

$ unset A; declare -A A; i=0;
$ for k in a b c d; do A[$k]=$((i++)); done; declare -p A
declare -A A=([a]="0" [b]="1" [c]="2" [d]="3" )
    
por 01.11.2018 / 18:37