2009-04-22 4 views
3

Ich habe ein Skript, in dem der Benutzer sollte eine Zeichenfolge mit Leerzeichen eingeben kann. Bisher habe ich:liest Benutzereingabe mit Leerzeichen in csh Shell Script

#bin/csh 

echo "TEST 1" 
echo -n "Input : " 
set TEST = $< 

echo "Var | " $TEST 

set TEST=`echo $TEST` 

echo "Var after echo | " $TEST 

set TEST=`echo $TEST | sed 's/ /_/g'` 

echo "Var after change | " $TEST 

Wenn ich die Zeichenfolge "r r r" auf "Eingang" eingeben, würde $ TEST nur "r" nehmen. Ich möchte $ TEST auf "r r r" setzen können. Ist das möglich? Wenn ich eine Zeichenfolge wie „1 1 1“ eingeben bekomme ich einen Fehler:

set: Variable name must begin with a letter.

Was ist der Grund dafür?

+1

Kann ich zeigen Ihnen http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/? Es wird nicht Ihr Problem lösen, aber es zeigt verschiedene Gründe, warum csh :-) –

+0

nicht die beste Schale für die Programmierung ist Ja. Normalerweise benutze ich sh. In diesem Fall muss ich zu einem anderen Verzeichnis navigieren und immer noch dort sein, wenn das Skript existiert. Ich mache das mit der Quelle (alias aenew 'source ~/scripts/aenewc'). Wenn der Benutzer also in einer c-Shell arbeitet, müsste das Skript auch in "csh" sein. Das ist der Grund, warum ich in diesem Fall auf csh zurückgegriffen habe. – Gayan

+0

Ja. Normalerweise benutze ich sh. In diesem Fall muss ich zu einem anderen Verzeichnis navigieren und immer noch dort sein, wenn das Skript existiert. Ich tue dies mithilfe von Quelle (alias aenew 'source ~/scripts/aenewc'). Wenn der Benutzer also in einer c-Shell arbeitet, müsste das Skript auch in "csh" sein. Das ist der Grund, warum ich in diesem Fall auf csh zurückgegriffen habe. – Gayan

Antwort

4

Es ist, weil Sie nicht Anführungszeichen in Ihrer SET Anweisung. Wenn Sie "r r r" als Ihre Eingabe eingeben, die zwei verschiedenen Varianten (nicht kotierte und zitiert) entsprechen: (! Zweimal)

set TEST=$< :is equivalent to: set TEST=r r r 
set TEST="$<" :is equivalent to: set TEST="r r r" 

Die erste davon setzt einfach TEST-"r" und r zu "". Der zweite Satz TEST zu "r r r". Das ist, weil csh können Sie mehrere Zuordnungen tun:

set a=1 b=2 c d=4 

So müssen Sie die zitierte Variante SET verwenden. Untersuchen Sie das folgende Transkript, um zu sehen, wie es funktioniert:

[pax ~]$ set x=$< ; echo .$x. 
hello 
.hello. 

[pax ~]$ set x="$<" ; echo $x ; echo .$b.$c. 
a b c 
.a b c. 
b: Undefined variable. 

[pax ~]$ set x=$< ; echo $x ; echo .$b.$c. 
a b c 
.a. 
... 

[pax ~]$ set x=$< ; echo $x ; echo .$b.$c. 
a b=7 c=urk! 
.a. 
.7.urk!. 

Der Grund, warum Sie die Fehler sind immer Sie mit Eingabe von "1 1 1" beschreiben ist, weil Sie effektiv ausführen:

set TEST=1 1 1 

und csh nehmen Dies bedeutet, dass Sie die Variable TEST auf "1" gefolgt von der Variablen 1 erstellen möchten, die nicht mit einem Buchstaben beginnt, daher nicht erlaubt. Mit der zitierten Variante wird dies:

set TEST="1 1 1" 

was tun wird, was Sie erwarten.

+0

Das hat funktioniert. Vielen Dank – Gayan