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?
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:
export
ed variables"${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.' )
)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
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.