web-dev-qa-db-fra.com

Comment passer un argument de tableau au script Bash

Cela me surprend que je ne trouve pas la réponse après 1 heure de recherche pour ceci . J'aimerais passer un tableau à mon script comme ceci:

test.sh argument1 array argument2

Je ne veux pas mettre cela dans un autre script bash comme suit:

array=(a b c)
for i in "${array[@]}"
do
  test.sh argument1 $i argument2
done
22
zhihong

Les tableaux Bash ne sont pas des "valeurs de première classe" - vous ne pouvez pas les transmettre comme une "chose".

En supposant que test.sh est un script bash, je le ferais

#!/bin/bash
arg1=$1; shift
array=( "$@" )
last_idx=$(( ${#array[@]} - 1 ))
arg2=${array[$last_idx]}
unset array[$last_idx]

echo "arg1=$arg1"
echo "arg2=$arg2"
echo "array contains:"
printf "%s\n" "${array[@]}"

Et l'invoque comme

test.sh argument1 "${array[@]}" argument2
24
glenn jackman

Avez votre script arrArg.sh comme ceci:

#!/bin/bash

arg1="$1"
arg2=("${!2}")
arg3="$3"
arg4=("${!4}")

echo "arg1=$arg1"
echo "arg2 array=${arg2[@]}"
echo "arg2 #elem=${#arg2[@]}"
echo "arg3=$arg3"
echo "arg4 array=${arg4[@]}"
echo "arg4 #elem=${#arg4[@]}"

Maintenant, configurez vos tableaux comme ceci dans un shell:

arr=(ab 'x y' 123)
arr2=(a1 'a a' bb cc 'it is one')

Et transmettez des arguments comme ceci:

. ./arrArg.sh "foo" "arr[@]" "bar" "arr2[@]"

Le script ci-dessus imprimera:

arg1=foo
arg2 array=ab x y 123
arg2 #elem=3
arg3=bar
arg4 array=a1 a a bb cc it is one
arg4 #elem=5

Note: Cela peut paraître étrange que j'exécute un script en utilisant la syntaxe . ./script. Notez qu'il s'agit d'exécuter des commandes du script dans l'environnement shell actuel

Q. Pourquoi l’environnement Shell actuel et pourquoi pas un sous-shell?
A. Parce que bash n'exporte pas de variables de tableau vers des processus enfants comme documenté ici par l'auteur de bash lui-même

12
anubhava

Vous pouvez écrire votre tableau dans un fichier, puis source le fichier dans votre script.

array.sh

array=(a b c)

test.sh

source $2
...

Exécutez le script test.sh:

./test.sh argument1 array.sh argument3
0
Dd H