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"作为输入时,两种不同的变体(未引用和引用)等效于:

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"

这会做你所期望的。

于 2009-04-22T06:50:26.143 回答