2009-05-25 11 views
22

Pour une raison quelconque, j'ai besoin de mon script pour pouvoir accepter des arguments avec des espaces. Si, par exemple, j'ai un script comme suit,Passage d'un argument contenant un espace dans le script shell

for SOME_VAR in [email protected] 
do 
    echo "$SOME_VAR" 
    cd "$SOME_VAR" 
done; 

si je passe des arguments au script (en supposant qu'il est appelé foo.sh)

sh foo.sh "Hello world" 

J'attends le script d'imprimer Bonjour tout le monde et changez le répertoire pour "Bonjour tout le monde". Mais je reçois ce message d'erreur au lieu

hello 
cd: 5: can't cd to hello 
world 
cd: 5: can't cd to world 

alors comment exactement ce que je passe avec l'espace arguments char une commande dans un script shell ?!

Répondre

40

Vous devez envelopper le [email protected] entre guillemets aussi: "[email protected]"

Cela indique au shell d'ignorer les espaces dans les arguments; cela ne transforme pas tous les arguments en une chaîne très longue.

+0

XD merci pour la réponse, j'étais comme aller répondre à moi-même, quelques explications supplémentaires http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST – Jeffrey04

+0

Mais si $ @ est une liste mettant " autour de lui le fusionnerait en une longue chaîne de caractères et ne le ferait pas passer par-dessus Et dans ce cas, il n'y a pas vraiment d'utilité à avoir une boucle for, un 'echo" normal $ @ "; cd" $ @ " Y a-t-il une solution où je peux avoir' for i dans '-construit délimite sur la coupure de ligne mais pas l'espace? –

+4

@AndreasWederbrand: Non." $ @ "est un jeton spécial qui signifie" envelopper chaque individu "a" bc "' devient (ou plutôt reste) '" a "" bc "' au lieu de '" abc "' ou '" a "" b "" c "'. –

Questions connexes