11
votes

Passer des arguments à une commande dans le script Bash avec des espaces

J'essaie de passer 2 arguments à une commande et que chaque argument contient des espaces, j'ai essayé d'échapper aux espaces dans les arguments, j'ai essayé d'envelopper dans des guillemets simples, j'ai essayé de s'échapper \ "mais rien Travail.

Voici un exemple simple. p>

ARG_BOTH="$ARG $ARG2"
+ ARG_BOTH='/tmp/a\ b/1.txt /tmp/a\ b/2.txt'
cat $ARG_BOTH
+ cat '/tmp/a\' b/1.txt '/tmp/a\' b/2.txt
cat: /tmp/a\: No such file or directory
cat: b/1.txt: No such file or directory
cat: /tmp/a\: No such file or directory
cat: b/2.txt: No such file or directory


0 commentaires

3 Réponses :


12
votes

voir http://mywiki.woolgedge.org/bashfaq/050

TLDR h3>

mettre vos arguments dans un tableau et appelez votre programme comme myUtil "$ {arr [@]}" code> p>

file1="file with spaces 1"
+ file1='file with spaces 1'
file2="file with spaces 2"
+ file2='file with spaces 2'
echo "foo" > "$file1"
+ echo foo
echo "bar" > "$file2"
+ echo bar
arr=("$file1" "$file2")
+ arr=("$file1" "$file2")
cat "${arr[@]}"
+ cat 'file with spaces 1' 'file with spaces 2'
foo
bar


1 commentaires

Existe-t-il une solution pour les coquillages de Posix réguliers comme Dash?



5
votes

La révision la plus simple de votre exemple de script shell qui fonctionnera correctement est la suivante: xxx

Cependant, si vous devez conclure un tas d'arguments entier dans Une variable de coquille, vous êtes dans une crique; Il n'y a pas de moyen portable et fiable de le faire. (Les tableaux sont spécifiques à bash; les seules options portables sont définissez et eval , qui demandent tous deux chagrin.) J'envisagerais un besoin pour cela comme une indication que Il était temps de réécrire dans un langage de script plus puissant, par exemple Perl ou python.


2 commentaires

Souhaitez-vous dire pourquoi définir pourrait être une source de chagrin?


Il n'y a qu'un seul "$ @" , il ne peut donc pas être utilisé pour plus d'une chose à la fois. Et ensemble - $ variable; cmd "$ @" est la scission de Word exactement la même manière cmd $ variable fait, donc ce n'est pas bon. Et vous devez vous assurer que vous n'obtenez pas l'une des nombreuses autres choses définir fait par accident.



6
votes

Cela pourrait être un bon cas d'utilisation pour la commande Generic "Set" em>, qui définit les paramètres de shell de niveau supérieur à une liste de mots. C'est-à-dire que 2 $, 2 $, ... et donc aussi $ * et $ @ obtenez-vous réinitialiser.

Ceci vous donne quelques-uns des avantages des tableaux tout en restant de toutes-POSIX-Shell-compatibles. P>

SO: P>

set "arg with spaces" "another thing with spaces"
cat "$@"


0 commentaires