Como passar a matriz ao bash shell script?

1

Como faço para passar uma matriz como uma variável de um primeiro script de shell bash para um segundo script.

first.sh
#!/bin/bash
AR=('foo' 'bar' 'baz' 'bat')
sh second.sh "$AR" # foo
sh second.sh "${AR[@]}" # foo
second.sh
#!/bin/bash
ARR=$1
echo ${ARR[@]}

Em ambos os casos, o resultado é foo . Mas o resultado que eu quero é foo bar baz bat .

O que estou fazendo de errado e como corrigi-lo?

    
por Mowzer 23.04.2016 / 09:41

1 resposta

2

A matriz AR é passada pelo primeiro argumento para second.sh .

first.sh

#!/bin/bash
AR=('foo' 'bar' 'a space' 'bat')
printf "AR array contains %d elements: " ${#AR[@]}
printf "%s " "${AR[@]}"
printf "\n"
./second.sh "$AR"
./second.sh "$(printf "(" ; printf "'%s' " "${AR[@]}" ; printf ")")"

Observe que sh não é mais usado para executar o script second.sh .

Esses printf encadeados são usados para forjar um único parâmetro que será seguro se alguns elementos da matriz contiverem caracteres de espaço.

second.sh

#!/bin/bash
declare -a ARR=$1
printf "ARR array contains %d elements: " ${#ARR[@]}
printf "%s " "${ARR[@]}"
printf "\n"

----

Para uma solução em que a matriz AR é passada usando qualquer número de argumentos para o script second.sh .

first.sh

#!/bin/bash
AR=('foo' 'bar' 'a space' 'bat')
printf "AR array contains %d elements: " ${#AR[@]}
printf "%s " "${AR[@]}"
printf "\n"
./second.sh "$AR"
./second.sh "${AR[@]}"

second.sh

#!/bin/bash
ARR=( "$@" )
printf "ARR array contains %d elements: " ${#ARR[@]}
printf "%s " "${ARR[@]}"
printf "\n"

----

O teste:

$ chmod +x *sh
$ ./first.sh
AR array contains 4 elements: foo bar a space bat
ARR array contains 1 elements: foo
ARR array contains 4 elements: foo bar a space bat
    
por 23.04.2016 / 14:58