web-dev-qa-db-fra.com

Concaténer des entrées dans une chaîne en boucle

J'ai une variable de sources qui est essentiellement une chaîne d'éléments séparés par des virgules:

SOURCES="a b c d e"

Je veux que l'utilisateur entre une destination pour chacune de ces sources, et je veux donc stocker cette entrée dans une chaîne ressemblant à celle ci-dessus mais contenant les destinations. Si je veux assigner a = 1, b = 2 ... etc, j'aurais quelque chose comme ceci:

echo $DESTINATIONS >>> "1 2 3 4 5"

Pour faire ce qui précède, je fais ceci:

SOURCES="a b c d e"
DESTINATIONS=""

for src in $SOURCES
do
    echo Input destination to associate to the source $src:
    read dest
    DESTINATIONS=$DESTINATIONS $dest
done

Cependant, si je fais une echo sur $DESTINATIONS, je la trouve vide. De plus, à chaque boucle, mon shell me dit:

-bash: = **myInput**: command not found

Une idée où je vais mal?

6
Matteo NNZ
SOURCES="a b c d e"
DESTINATIONS=""

for src in $SOURCES
do
    echo Input destination to associate to the source $src:
    read dest
    DESTINATIONS+=" ${dest}"
done
echo $DESTINATIONS

travaille pour moi.

5
dutiona

Vous devriez utiliser un tableau, pas une chaîne délimitée.

sources=(a b c d e)

for src in "${sources[@]}"
do
    read -p "Input destination to associate to the source $src" dest
    destinations+=( "$dest" )
done

printf '%s\n' "${destinations[@]}"
3
chepner

Le problème le plus évident avec votre code est cette ligne:

DESTINATIONS=$DESTINATIONS $dest

La ligne ci-dessus devrait plutôt être écrite:

DESTINATIONS="$DESTINATIONS $dest"

Le problème: Vous exécutez $ dest et passez dans un environnement de DESTINATIONS = $ DESTINATIONS. J'espère que cela explique les messages d'erreur que vous voyez. 

J'ai essayé votre code avec les citations que j'ai suggérées et cela fonctionne bien.

2
Mark

Q: Qu'est-ce qui ne va pas?
R: Ne pas utiliser de guillemets si nécessaire.

Si vous utilisez un espace non-cité, il sera utilisé par Shell pour scinder la ligne. 

Quand vous utilisez:

DESTINATIONS=$DESTINATIONS $dest

Le shell comprend la variable $ dest comme une commande à exécuter, c’est pourquoi vous obtenez le message d'erreur:

-bash: = **myInput**: command not found

Pour résoudre le problème, citez simplement l'espace.
Il y a plusieurs façons de le faire:

DESTINATIONS=$DESTINATIONS" "$dest
DESTINATIONS=$DESTINATIONS' '$dest
DESTINATIONS="$DESTINATIONS"' '"$dest"
DESTINATIONS="$DESTINATIONS $dest"

La dernière option est probablement la plus simple et la meilleure dans l’ensemble.
Vous pouvez aussi utiliser cette syntaxe (depuis bash 3.1-alpha1):

    DESTINATIONS+=" $dest"

Aussi, s'il vous plaît !, citez vos autres extensions:

echo "$DESTINATIONS"
1
sorontar