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
3 Réponses :
voir http://mywiki.woolgedge.org/bashfaq/050
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
Existe-t-il une solution pour les coquillages de Posix réguliers comme Dash?
La révision la plus simple de votre exemple de script shell em> qui fonctionnera correctement est la suivante: 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 code> et
eval code>, 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. P> p>
Souhaitez-vous dire pourquoi définir code> pourrait être une source de chagrin?
Il n'y a qu'un seul "$ @" code>, il ne peut donc pas être utilisé pour plus d'une chose à la fois. Et
ensemble - $ variable; cmd "$ @" code> est la scission de Word exactement la même manière
cmd $ variable code> fait, donc ce n'est pas bon. Et vous devez vous assurer que vous n'obtenez pas l'une des nombreuses autres choses i>
définir code> fait par accident.
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 "$@"