Problema com o comprimento da matriz no script bash

4

Estou escrevendo um script que armazena alguns dos argumentos da linha de comando como uma matriz e usa a matriz mais tarde, mas estou tendo problemas para obter o comprimento correto da matriz no script.

No terminal, usando o bash, eu tentei isso:

$:>array=( 1 2 3 4 ) $:>echo array = ${array[*]} and length = ${#array[*]}

e a saída do eco é:

array = 1 2 3 4 and length = 4

Qual está funcionando corretamente. Eu simplifiquei o script com o qual eu estava tendo um problema, e o script deveria fazer exatamente a mesma coisa, mas eu obtive um comprimento de matriz de 1. O script é o seguinte:

#!/bin/bash list=${@} echo array = ${list[*]} and length = ${#list[*]}

E se eu chamar o script do terminal com

$:>./script.sh ${test[*]}

a saída é

array = 1 2 3 4 and length = 1

Eu tentei uma maneira diferente de salvar a matriz e imprimi-la, mas não consigo descobrir como corrigir esse problema. Qualquer solução seria apreciada!

    
por Aidan 28.07.2016 / 21:11

1 resposta

7

Você está achatando a entrada em um valor único.

Você deve fazer

list=("${@}")

para manter a matriz e o potencial de espaço em branco nos argumentos.

Se você perder o " , algo como ./script.sh "a b" 2 3 4 retornará um comprimento de 5, porque o primeiro argumento será dividido. Com " , obtemos

$ cat x
#!/bin/bash
list=("${@}")

echo array = ${list[*]} and length = ${#list[*]}

$ ./x "a b" 2 3 4  
array = a b 2 3 4 and length = 4
    
por 28.07.2016 / 21:16

Tags