3

ユーザーがスペースを含む文字列を入力できるスクリプトがあります。これまでのところ、私は持っています:

#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

「input」に文字列「rr r」を入力すると、$TEST は「r」しか取りません。$TEST を "rr r" に設定できるようにしたい。これは可能ですか?「1 1 1」のような文字列を入力すると、エラーが発生します。

set: 変数名は文字で始まる必要があります。

これの理由は何ですか?

4

1 に答える 1

5

SETこれは、ステートメントで引用符を使用していないためです。入力"r r r"として入力すると、2 つの異なるバリアント (引用符なしと引用符付き) は次と同等になります。

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

それらの最初のものは単にTESTto"r"rto を設定します""(2 回!)。2 番目は に設定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

これは、変数set toの後にcsh変数 を作成することを意味します。これは文字で始まらないため、許可されません。引用されたバリアントでは、これは次のようになります。TEST"1"1

set TEST="1 1 1"

これはあなたが期待することを行います。

于 2009-04-22T06:50:26.143 に答える