Matrizes de bash - não funciona

0

Fazendo algumas formatações divertidas, jogando com xargs e transmitindo dados para os scripts, etc., e estou tendo um pequeno problema com a criação de uma matriz.

alias lstest='ls | xargs --delimiter="\n" ~/.config/lsdif_color.sh'

for fileLine in "$@"
do
    if [[ $fileLine == total* ]]; then echo $fileLine;
    else 
        cols=($fileLine);
        echo ${#cols}, $l
        echo ${cols[0]}
        echo ${cols[$(( ${#cols}-1 ))]}
    fi;
done 

Então, isso funciona bem. O array "cols" mostra o tamanho certo e produz o primeiro e o último elemento perfeitamente.

Agora, para o problema:

...
else
  # Method 1
  declare -a cw=(11 2 8 7 6 5 4 3 6 0);
  echo ${#cw}

  # Method 2
  widths=($(11 2 8 7 6 5 4 3 6 0));
  echo ${#widths}

  #Method 3
  cws[0]="11"
  cws[1]="2"
  cws[3]="8"
  cws[4]="7"
  cws[5]="6"
  cws[6]="5"
  cws[7]="4"
  cws[8]="3"
  cws[9]="6"
  cws[10]="0"

  echo ${#cws}

fi;

Em todos os três métodos de tentativa de definir esses arrays, o tamanho do eco é sempre 2. Não 10. O array Cols acima lista 10 elementos, mas a tentativa de criar um array de números falha, mesmo quando estou deixando que eles sejam strings.

Por quê?

Obrigado Jaeden "Sifo Dyas" al'Raec Ruiner

    
por JaedenRuiner 11.12.2015 / 22:25

2 respostas

1

Você só precisa usar:

echo {#cws[@]}
  • {#cws} é normalmente usado para retornar o comprimento de uma string
  • o [@] é importante, porque sem isso, o valor de $cws não é a matriz inteira, ele é o primeiro elemento do valor da matriz, também conhecido como $cws[0]

Por exemplo, em nosso prompt de comando, podemos fazer uma matriz simples de três elementos semelhante à sua:

$ cws[0]="11"; cws[1]="2"; cws[3]="8"

Agora veja o que acontece quando nos referimos apenas a $cws :

$ echo $cws
11

Então, ao usar a expansão bash para determinar o tamanho de algo, {# ... } , sem o [@] , você escreve ${#cws} , $cws é 11 , então você está pedindo bash "qual é o comprimento de 11"? e, claro, o bash olha para a string 11 que tem dois caracteres, então Bash diz 'Oh, é 2':

$ echo ${#cws}
2

Então, é por isso que para especificar você quis dizer o tamanho do array, lembre-se do [@] :

$ echo ${#cws[@]}
3
    
por 11.12.2015 / 22:57
1

O problema está em como os arrays são referenciados. Para começar:

$ declare -a cw=(11 2 8 7 6 5 4 3 6 0)

Agora, vamos analisar o comprimento de duas maneiras diferentes:

$ echo ${#cw}
2
$ echo ${#cw[@]}
10

O primeiro método está retornando o comprimento do elemento do indice 0 (neste caso, também é o primeiro elemento de cw ). O segundo método, ao contrário, está retornando o número de elementos na matriz.

Mais

Na pergunta, há o código:

widths=($(11 2 8 7 6 5 4 3 6 0));

Este código tenta executar um comando chamado 11 com argumentos 2 8 7 6 5 4 3 6 0 . O resultado depende se existe um comando chamado 11 . Se não houver, você verá:

bash: 11: command not found
    
por 11.12.2015 / 22:39

Tags