web-dev-qa-db-fra.com

Comment transmettre la matrice à Bash Shell Script?

Comment puis-je passer une matrice comme une variable d'un premier script shell bash à un deuxième script.

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

Dans les deux cas, le résultat est foo. Mais le résultat que je veux est foo bar baz bat.

Qu'est-ce que je fais mal et comment puis-je le réparer?

7
Mowzer

Afaik, tu ne peux pas. Vous devez le sérialiser et le désérialiser, par exemple Via le tableau des arguments:

premier

#!/bin/bash
ar=('foo' 'bar' 'baz' 'bat')
second "${ar[@]}" #this is equivalent to: second foo bar baz bat

deuxième

#!/bin/bash
arr=( "$@" )
printf ' ->%s\n' "${arr[@]}"
<<PRINTS
   -> foo
   -> bar
   -> baz
   -> bat
PRINTS

Un peu de conseil:

  • réservez toutes les capuchons pour exported variables
  • sauf si vous avez une très bonne raison spécifique de ne pas le faire "${someArray[@]}" Devrait toujours être coché double; Cette formule se comporte exactement comme 'array item 0' 'array item 1' 'aray item 2' 'etc.' (en supposant someArray=( 'array item 0' 'aray item 1' 'aray item 2' 'etc.' ))
8
PSkocik

Le tableau AR est passé via le premier argument à second.sh.

premier.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 ")")"

Notez que sh n'est plus utilisé pour exécuter le second.sh script.

Ces chaînes printf sont utilisées pour forger un seul paramètre qui sera en sécurité si certains éléments de tableau contiennent des caractères d'espace.

seconde.sh

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

----

Pour une solution dans laquelle le tableau AR est passé à l'aide de tout nombre d'arguments sur le second.sh script.

premier.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[@]}"

seconde.sh

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

----

Le test:

$ 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
2
Jay jargot

premier

#!/bin/bash
ar=('foo' 'bar' 'baz' 'bat')
./second "${ar[@]}"

deuxième

#!/bin/bash
read -a arr1 <<< "${BASH_ARGV[@]}"
echo "${arr1[@]}"

Cela aurait dû être suffisant, mais l'ordre de la matrice est inversé, alors j'ai ajouté:

for (( i=${#arr1[@]}-1,j=0 ; i>=0 ; i--,j++ ))
do
    arr2[j]="${arr1[i]}"
done
echo "${arr2[@]}"

read -a Lit l'entrée dans Array Arr1, mais pour une raison quelconque, je ne peux pas comprendre, le tableau est inversé, alors je renverse le retour dans l'ARR2.

0
Dani_l