2009-04-22 280 views
3

我有一個腳本,用戶應該可以輸入帶空格的字符串。到目前爲止,我有:用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 

如果我在「輸入」輸入字符串「R R R」,$測試只會採取「R」。我希望能夠將$ TEST設置爲「r r r」。這可能嗎? 如果我輸入類似「111」的字符串,我得到一個錯誤:

set: Variable name must begin with a letter.

什麼是這個原因?

+1

我可以指您http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/嗎?它不會解決你的問題,但它說明了爲什麼csh不是編程的最佳外殼的各種原因:-) – 2009-04-22 08:20:14

+0

是的。我通常使用sh。在這種情況下,我需要導航到不同的目錄,並在腳本存在時仍然在那裏。我通過使用源(別名aenew'source〜/ scripts/aenewc')來做到這一點。因此,如果用戶在c shell中工作,那麼腳本也必須位於「csh」中。這就是我在這種情況下使用csh的原因。 – Gayan 2009-04-22 08:30:59

回答

4

這是因爲您沒有在您的SET聲明中使用引號。當你進入"r r r"作爲輸入,兩個不同的變體(不帶引號和引用)相當於:(!兩次)

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

其中第簡單地設置TEST"r"r""。第二套TEST"r r r"。這是因爲csh讓你不喜歡多任務:

set a=1 b=2 c d=4 

所以你需要使用的SET的引用變量。檢查下面的成績單,看看它是如何工作的:

[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!. 

你得到你的"1 1 1"輸入描述錯誤的原因是因爲你有效地執行:

set TEST=1 1 1 

csh正在這意味着您要創建變量TEST設置爲"1",後跟變量1,該變量不以字母開頭,因此不允許。隨着引用的變體,這變成:

set TEST="1 1 1" 

這將做你期望的。