2009-04-22 13 views
3

私は、ユーザがスペースを含む文字列を入力できるスクリプトを用意しています。これまでのところ私が持っている:cshでユーザ入力をスペースで読み取るシェルスクリプト

#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を" 入力した場合、$ TESTは唯一の "R" を取るだろう。 $ TESTを "r r r"に設定したいと思っています。これは可能ですか? 私は「1 1 1」のような文字列を入力した場合、私はエラーを取得する:

set: Variable name must begin with a letter.

その理由は何ですか?

+1

http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/にアクセスできますか?あなたの問題を解決することはできませんが、cshがプログラミングにとって最高のシェルではないさまざまな理由がよくわかります:-) –

+0

はい。私は通常shを使います。この場合、別のディレクトリに移動し、スクリプトが存在する場合はそこに移動する必要があります。私はsource(別名 'source〜/ scripts/aenewc')を使ってこれを行います。したがって、ユーザーがcシェルで作業している場合は、スクリプトも "csh"になければなりません。これが私がこのケースでcshに頼った理由です。 – Gayan

+0

はい。私は通常shを使います。この場合、別のディレクトリに移動し、スクリプトが存在する場合はそこに移動する必要があります。私はsource(別名 'source〜/ scripts/aenewc')を使ってこれを行います。したがって、ユーザーがcシェルで作業している場合は、スクリプトも "csh"になければなりません。これが私がこのケースでcshに頼った理由です。 – Gayan

答えて

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" 

これらの最初は、単に"""r"からTESTrを設定します(2回!)。 2番目のセットはTEST"r r r"です。

set a=1 b=2 c d=4 

だからあなたがSETの引用されたバリアントを使用する必要があります。cshはあなたのような複数の割り当てを行うことができますからです。それがどのように動作するか確認するために、次のトランスクリプトを調べます

[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" 

+0

それはうまくいった。ありがとう – Gayan