Question Comment concaténer des chaînes d'une liste dans un script bash?


Par exemple:

List="A B C D"
for I in $List
do
    OUT=$OUT" -$I"
done

Lorsque je lance ceci, le résultat est le suivant:

" -A -B -C -D"

mais je veux que ce soit:

"-A -B -C -D"

Comment concaténer sans l'espace de tête?

Ce fichier BT est une liste d'arguments pour un script.


4
2017-09-17 11:57


origine




Réponses:


Utilisation extension de paramètre conditionnel:

List="A B C D"
for I in $List
do
    OUT=${OUT:+$OUT }-$I
done

L'expression ${OUT:+$OUT } se développe à rien si OUT n'est pas défini ou vide; s'il est mis à quelque chose, alors il se développe à quelque chose suivi d'un espace.

Cependant, ce type d'opération - traiter une chaîne séparée par des espaces en tant que liste - présente des problèmes possibles: citer, des valeurs contenant des espaces de manière inattendue, etc. Il serait préférable d'utiliser un tableau:

List=(A B C D)
for I in "${List[@]}"
do    
    OUT=${OUT:+$OUT }-$I
done

Selon ce que vous faites avec $OUT, il pourrait être judicieux d'en faire un tableau également:

List=(A B C D)
OUT=()
for I in "${List[@]}"; do
  OUT+=("-$I")
done

Alors vous utiliseriez "${OUT[@]}" transmettre les éléments du tableau à une autre commande en tant qu’arguments séparés.

Pour revenir à votre version originale, dans ce cas précis, vous pouvez également utiliser sed et passez la boucle bash entièrement:

OUT=$(sed -E 's/^| /&-/g' <<<"$List")

9
2017-09-17 12:13





Vous pouvez supprimer l’espace de tête en utilisant une commande après la boucle for, par exemple

OUT=${OUT# }

Menant à

List="A B C D"
for I in $List
do
    OUT=$OUT" -$I"
done
OUT=${OUT# }

0
2017-09-17 12:11