#!/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.
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.