在csh Shell Script中读取带空格的用户输入

时间:2009-04-22 06:41:19

标签: shell 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

如果我在“input”处输入字符串“r r r”,$ TEST将只接受“r”。我希望能够将$ TEST设置为“r r r”。这可能吗? 如果我输入类似“1 1 1”的字符串,我会收到错误:

  

set:变量名必须以a开头   信。

这是什么原因?

1 个答案:

答案 0 :(得分: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" 开头信,因此不允许。使用引用的变体,这变为:

{{1}}

会做你期望的事。