在 csh 中执行读取提示并转换为多行别名时出错

在 csh 中执行读取提示并转换为多行别名时出错

大家好,我遇到了这个问题,我有一个 csh 中的示例程序(我知道它不是用于脚本的最佳语言,但这里我没有选择)其如下:

#!/bin/csh    
echo 'please enter values' 
read a 
read -e b
echo "My values are $a and $b" 

您可能会看到,我的第二次读取将接受文件输入。这是必需的,因为我的实际程序将有它;现在我想要做的是将其转换为别名,但是当我执行上述脚本时,我得到了以下输出

please enter values
read: Command not found
read: Command not found
a: Undefined variable

我该如何解决这个问题,同时我还想将这 4 行全部转换为多行别名。我以前写过单行别名,没有问题,但不确定多行是否可行。如果有人能帮忙,我将不胜感激

答案1

正如您所发现的,C shell 没有read类似于 Bourne 类型 shell 的内置函数。

我是不是精通csh语法,但据我所知,最接近的等价方法是使用特殊变量$<。来自man csh

       $<      Substitutes a line from the standard input, with no further
               interpretation.  It can be used to read from the keyboard
               in a shell script.

例如

$ cat myscript.csh
#!/bin/csh

echo 'please enter values'
set a = $<
set b = $<
echo "My values are $a and $b"

这使

$ ./myscript.csh
please enter values
123
abc
My values are 123 and abc

请注意,在处理多字输入时,赋值存在与实现相关的差异$<- 特别是,Tenextcsh默认不引用输入,而是要求$<:q获得与 BSD 相同的行为csh。此外(据我所知)没有与 bash shell 等效的内置 readline 编辑支持read -e

就多行别名而言,它们确实有效:

% alias jo '\
echo "please enter values "\
set a = $< \
set b = $< \
echo "My values are $a and $b"'
%
% alias
jo
echo "please enter values "
set a = $<
set b = $<
echo "My values are $a and $b"

测试

% jo
% please enter values
123
foo bar
My values are 123 and foo bar
%

然而我并不建议依赖这个功能。

相关内容