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

在csh Shell脚本中读取带空格的用户输入,shell,csh,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 #b

我有一个脚本,用户应该能够在其中输入带有空格的字符串。到目前为止,我已经:

#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
#bin/csh
回声“测试1”
echo-n“输入:”
设置测试=$<
echo“Var |”$TEST
set TEST=`echo$TEST`
echo“echo |”之后的Var$TEST
set TEST=`echo$TEST | sed's/\ug'`
echo“更改后的变量|”$TEST
如果我在“input”处输入字符串“r”,那么$TEST将只取“r”。我希望能够将$TEST设置为“r”。这可能吗? 如果输入类似“1”的字符串,则会出现错误:

set:变量名必须以 信


这是什么原因?

这是因为在
SET
语句中没有使用引号。当您输入
“r”
作为输入时,两个不同的变量(无引号和引号)相当于:

set TEST=$<    :is equivalent to:  set TEST=r r r
set TEST="$<"  :is equivalent to:  set TEST="r r r"
因此,您需要使用带引号的
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!.
csh
则认为这意味着您希望创建变量
TEST
设置为
“1”
,然后是变量
1
,该变量不以字母开头,因此是不允许的。对于引用的变体,这将成为:

set TEST="1 1 1"

这将满足您的期望。

我可以给您指一下吗?它不会解决您的问题,但它说明了为什么csh不是最好的编程shell的各种原因:-)是的。我通常使用sh。在这种情况下,我需要导航到另一个目录,并且在脚本存在时仍然在那里。我使用source(别名aenew'source~/scripts/aenewc')来实现这一点。因此,如果用户在c shell中工作,脚本也必须在“csh”中。这就是我在这种情况下求助于csh的原因。是的。我通常使用sh。在这种情况下,我需要导航到另一个目录,并且在脚本存在时仍然在那里。我使用source(别名aenew'source~/scripts/aenewc')来实现这一点。因此,如果用户在c shell中工作,脚本也必须在“csh”中。这就是我在这个案子中求助于csh的原因。
set TEST=1 1 1
set TEST="1 1 1"