2017-03-21 2 views
3

I ont une variable de sources qui est essentiellement une série d'éléments séparés par des virgules:entrées Concaténer à chaîne tandis que dans la boucle

SOURCES="a b c d e" 

Je veux l'utilisateur d'entrer une destination pour chacun de cette source, et je Je veux donc stocker cette entrée dans une chaîne ressemblant à ce qui précède mais contenant les destinations. Si je veux attribuer 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 un echo sur $DESTINATIONS, je le trouve vide. De plus, à chaque boucle, ma coquille me dit:

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

Toute idée où je fais mal?

+0

Vous n'avez pas de séparation de virgules dans 'SOURCES'? juste l'espace séparé? – Inian

Répondre

3
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 

fonctionne pour moi.

+0

Merci beaucoup. "dutiona" :) –

2

La question la plus évidente avec votre code est cette ligne:

DESTINATIONS=$DESTINATIONS $dest 

Au contraire, la ligne ci-dessus doit être écrit:

DESTINATIONS="$DESTINATIONS $dest" 

La question: Vous exécutez $ dest et le passage d'un environnement de DESTINATIONS = $ DESTINATIONS. Cela explique, espérons-le, les messages d'erreur que vous voyez.

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

3

Vous devez 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[@]}" 
1

Q: Quel est le problème?
A: Ne pas utiliser de guillemets si nécessaire.

Si vous utilisez un espace non-cité, il sera utilisé par le shell pour diviser la ligne.

Lorsque vous utilisez:

DESTINATIONS=$DESTINATIONS $dest 

La variable $ dest est comprise par le shell en tant que commande à exécuter, c'est pourquoi vous obtenez l'erreur:

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

Pour résoudre le problème, juste citer 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 aussi le meilleur dans l'ensemble.
Vous pouvez également utiliser cette syntaxe (depuis bash 3.1-alpha1):

DESTINATIONS+=" $dest" 

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

echo "$DESTINATIONS"