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

Gay*_*yan 3 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
Run Code Online (Sandbox Code Playgroud)

如果我在“输入”中输入字符串“ rr r”,则$ TEST仅取“ r”。我希望能够将$ TEST设置为“ rr r”。这可能吗?如果输入“ 1 1 1”之类的字符串,则会出现错误:

设置:变量名必须以字母开头。

这是什么原因?

pax*_*blo 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"
Run Code Online (Sandbox Code Playgroud)

其中第一个只需设置TEST"r"r即可""(两次!)。第二组设置TEST"r r r"。这是因为csh,您可以执行多个任务,例如:

set a=1 b=2 c d=4
Run Code Online (Sandbox Code Playgroud)

因此,您需要使用引号的变体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!.
Run Code Online (Sandbox Code Playgroud)

之所以收到您输入的描述错误的原因"1 1 1"是因为您正在有效执行:

set TEST=1 1 1
Run Code Online (Sandbox Code Playgroud)

csh表示您要创建变量TEST集,"1"后跟变量1,该变量不能以字母开头,因此是不允许的。使用引用的变体,它将变为:

set TEST="1 1 1"
Run Code Online (Sandbox Code Playgroud)

它将完成您的期望。