2011-10-14 5 views
0

En raison de la valeur par défaut de IFS, j'obtiens le résultat suivant.Script shell Linux: Ignorer les guillemets de IFS

STR="this is a \"valid string\"" 
for a in $STR; do 
    echo $a; 
done 

donne une sortie comme:

this 
is 
a 
"valid 
string" 

Mais je ne veux pas diviser "chaîne valide". je besoin d'une sortie comme:

this 
is 
a 
"valid string" 

Alors, comment puis-je faire shell ignorer les guillemets doubles de IFS?

+0

Veuillez formater correctement votre question! – jman

+0

désolé. Je suis nouveau à stackoverflow. fait maintenant. – sachinpkale

Répondre

0

Ce n'est pas facile. Vous pouvez passer à Perl à la place. Ou, si vous avez le contrôle total sur la chaîne, et personne ne peut peut-être jamais insérer quelque chose mal dans, vous pouvez utiliser ce code:

str="a b c \"d e\"" 
eval "set args $str; shift" 

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

Ceci affichera le dernier mot sans les guillemets, cependant. Et il écrase les arguments de la commande lune au programme shell lui-même.

Si vous devez conserver les guillemets, cela s'appelle en analysant et ne devrait pas être fait par un programme shell, car cela devient trop compliqué.

2

Il existe deux types de guillemets: les guillemets littéraux et les guillemets syntaxiques. Les guillemets externes de STR sont syntaxiques, ce qui signifie qu'ils ne font pas partie de la chaîne, ils sont juste utilisés pour dire à Bash où la chaîne commence et se termine. Les guillemets internes (échappés) sont littéraux, donc ils font partie de la chaîne. En d'autres termes, le littéral valeurde votre chaîne est:

this is a "valid string" 

Maintenant, si vous voulez faire une boucle sur, vous devez vous rappeler que cette chaîne se compose de cinq (séparés par des espaces) mots littérales:

this 
is 
a 
"valid 
string" 

Si vous voulez contourner ce problème, que vous pouvez utiliser eval (mais méfiez-vous de la security issues grave) ou des tableaux:

declare -a STR=(this is a "valid string") 
for str in "${STR[@]}" 
do 
    echo "$str" 
done