web-dev-qa-db-fra.com

Créer un tableau en boucle à partir du nombre d'arguments

#!/bin/bash
COUNTER=$#
until [ $COUNTER -eq 0 ]; do
args[$COUNTER]=\$$COUNTER
let COUNTER-=1
done
echo ${args[@]}

Quand je lance ceci, j'obtiens les résultats suivants

user@Host:~/sandbox# ./script.sh first second third
$1 $2 $3

et je m'attends à ce qu'il fasse écho à ce que $ 1, $ 2 et $ 3 ne sont pas une valeur texte de "$ 1"

J'essaie d'écrire un script en bash qui créera un tableau de la taille du nombre d'arguments que je lui donne.
Je m'attends

user@Host:~/sandbox# ./script.sh alpha bravo charlie
alpha bravo charlie

ou

user@Host:~/sandbox# ./script.sh 23425 jasson orange green verb noun coffee
23425 jasson orange green verb noun coffee

Donc, le but est de faire

args[0]=$1
args[1]=$2
args[2]=$3
args[3]=$4

La façon dont je l'ai, le $1,$2,$3 ne sont pas interpolés mais simplement lus comme une chaîne de texte.

20
spezticle

Vous pouvez utiliser le += opérateur à ajouter à un tableau.

args=()
for i in "$@"; do
    args+=("$i")
done
echo "${args[@]}"

Cela montre comment l'ajout peut être fait, mais le moyen le plus simple d'obtenir les résultats souhaités est:

echo "$@"

ou

args=("$@")
echo "${args[@]}"

Si vous souhaitez conserver votre méthode existante, vous devez utiliser indirection avec !:

args=()
for ((i=1; i<=$#; i++)); do
   args[i]=${!i}
done

echo "${args[@]}"

De la référence Bash:

Si le premier caractère du paramètre est un point d'exclamation (!), Un niveau d'indirection variable est introduit. Bash utilise la valeur de la variable formée à partir du reste du paramètre comme nom de la variable; cette variable est ensuite développée et cette valeur est utilisée dans le reste de la substitution, plutôt que la valeur du paramètre lui-même. C'est ce qu'on appelle l'expansion indirecte. Les exceptions sont les extensions de $ {! Prefix} et $ {! Name [@]} décrites ci-dessous. Le point d'exclamation doit suivre immédiatement l'accolade gauche pour introduire l'indirection.

39
jordanm