2012-10-31 6 views
5

Ich habe Probleme, etwas Grundlegendes mit Csh zu tun. Ich habe eine Zeichenfolge:Csh Hinzufügen von Zeichenfolgen zu einem Array, Whitespace-Probleme

set newCmd = "$expansionCmd –option1 –option2 …" 

Und ich bin ein Array dieser Strings zu schaffen, die möchte ich später ausführen:

set expansionCmdList = ($expansionCmdList[*] "$newCmd") 
#I also tried without quotes, e.g. just $newCmd 

Schließlich versuche ich überlaufen und führen Sie folgende Befehle ein:

Das Problem ist jedoch, dass die Array-Einträge nicht die vollständige Zeichenfolge sind, sondern jeder Teil der Zeichenfolge durch Leerzeichen getrennt ist, dh der erste Eintrag ist nur "$ expansionCmd", der nächste Eintrag würde b e "-option1" usw.

Entschuldigung im Voraus für die Verwendung von C-Shell, die Codebasis meines Unternehmens ist damit fest.

Antwort

7

Jedes Mal, wenn Sie ein ganzes Array erweitern und die Identitäten einzelner Elemente beibehalten möchten, benötigen Sie den Modifikator :q in der Erweiterung. Sonst, sobald Sie etwas wie set expansionCmdList=($expansionCmdList[*] "$newCmd") machen, werden alle vorherigen Befehle in der Liste in ihre Komponentenwörter aufgeteilt, von denen jedes jetzt sein eigenes Array-Element ist. Einfache Demonstration:

% set a = (a "b c" d) 
% echo $a[2] 
b c 
% set a = ($a[*] e) 
% echo $a[2] 
b 

Hoppla, Sie haben das Array vermasselt, bevor Sie sogar Ihre Ausführungsschleife erhalten. Die Dinge gehen viel besser mit :q:

% set a = (a "b c" d) 
% set a = ($a:q e) 
% echo $a[2] 
b c 

Sie müssen den gleichen Modifikator in der for-Schleife verwenden:

foreach exCmd ($expansionCmdList:q) 

Schließlich `` exCmd versucht, einen Befehl wörtlich genannt "exCmd" zu laufen. Was Sie tun möchten, ist führen Sie den Wert der Variablen. Sie werden hier wahrscheinlich mehr Probleme mit Leerzeichen haben, und Sie können sie nicht lösen, indem Sie jeden Befehl zu einem Array machen, da csh Array-Arrays nicht unterstützt. Faire Warnung. Aber wenn die Befehle keine Quotierung Bedürfnisse haben, dies funktionieren wird:

$exCmd 
+1

Dank Mann ... schwöre ich die einzige Dokumentation ich auf c-Shell zu finden ist Leute, die sagen, keine c-Schale zu benutzen. – JDS

+1

Nun, der einzige wesentliche Grund, csh nicht für Skripting zu verwenden, ist, dass csh keine sehr gute Skriptsprache ist ... aufgrund von Dingen wie der Tatsache, dass man Aliase in Knoten drehen muss, um irgendeine Art von Unterprogrammfähigkeit zu haben . Aber wenn du das hast, hast du das. Und es hatte Arrays und eingebaute Arithmetik lange vor den POSIX-Shells. :) –

+0

Beachten Sie, dass die Verwendung von '$ {array}: q' nicht funktioniert - es muss' $ arr: q' sein. –

0

Mark-Lösung für die meisten Anwendungen deutlich überlegen ist, aber es ist eine weitere Option. Statt foreach direkt zu verwenden, erhalten die Größe des Arrays und durchlaufen die Sequenz:

set BUILD_MATRIX = ("makefile.make:make --jobs --makefile=makefile.make" \ 
        "Makefile:make --jobs --makefile=Makefile" \ 
        "build.xml:ant") 

foreach i (`seq ${#BUILD_MATRIX}`) 
    echo $i 
    echo $BUILD_MATRIX[$i] 
end 

(kopiert von Accessing array elements with spaces in TCSH)

Verwandte Themen