2017-01-02 1 views
3
#!/bin/csh -f 

foreach line ("`cat test`") 
    set x=`echo "$line" | awk '{split($0, b, " "); print b[1]}'` 
    echo "$x" 
end 

fichier de test contient le contenu suivant:Pourquoi mon script csh ne fonctionne-t-il pas avec des caractères spéciaux?

 
How to Format 
Stack[7] Overflow 
Put returns between paragraphs 

Sur l'exécution du script, je reçois l'erreur suivante:

 
set: No match. 

Comment stocker la chaîne qui contient un caractère spécial comme des crochets [] dans un variable, puis les utiliser dans le code?

Répondre

3

Le problème est que vous faites:

set x = [some string with shell globbing characters] 

Cela ne fonctionnera pas pour la même raison que set x = foo œuvres, mais set x = [foo] ne fonctionne pas. Vous devez utiliser set x = "[foo]" (ou '[foo]') pour échapper aux caractères spéciaux de globalisation de coque ([ et ] dans ce cas).

L'imbrication de citations dans le shell C est assez difficile, et c'est l'une des raisons it's generally discouraged to use the C shell for scripting. C'est peut-être possible pour votre commande, mais je ne suis pas assez intelligent (ou trop paresseux) pour comprendre comment. Ma solution est généralement pour définir la variable noglob spéciale pour empêcher l'expansion des caractères jokers:

set noglob 
foreach line ("`cat test`") 
    set x = `echo "$line" | awk '{split($0, b, " "); print b[1]}'` 
    echo "$x" 
end 

sorties:

How 
Stack[7] 
Put 

post-scriptum Il y a un moyen plus facile de faire écho au premier mot de chaque ligne; mettez-le dans une liste:

set noglob 
foreach line ("`cat test`") 
    set x = ($line) 
    echo "$x[1]" 
end 
+0

Merci. Les deux solutions fonctionnent pour moi. –