不能在csh中使用foreach

时间:2014-08-26 08:39:17

标签: arrays shell foreach csh

我是c shell的新手,似乎我不能使用foreach循环来返回一个数组。

我收到一条引用missing }的错误消息,我知道问题出现在以下行中:

foreach line ( `grep if "$f"`)

这是完整的代码:

set f = $<
echo $f
if (-f $f) then
    echo $f
    foreach line (  ` grep if "$f" ` )
        echo ${line}
        if (${line[0-]}=~/(\d)+/) then
            echo "wow ${line} is an amazing arithmetic condition"
        endif
    end
endif

1 个答案:

答案 0 :(得分:2)

您需要添加更多引号以防止解释各种特殊字符,例如:

echo "$line"

一般情况下,除非有理由不引用所有变量,否则总是要引用所有变量。

此外,=~并没有按照您的预期行事。来自csh(1)

  

运算符=~!~类似于!===,但右侧是一个glob-pattern(请参阅文件名替换),左侧是操作数匹配。

它是一个基本的glob模式,不是正则表达式!

在(t)csh中无法进行正则表达式。像/(\d)+/这样的模式在csh的任何地方都不起作用。我们需要依赖grep之类的外部工具,我们实际上可以使用之前的grep调用来合并两个if语句。一个完整的例子:

set f = "$<"
echo "Using file: $f"

if ( -f "$f" ) then
    foreach line ( "`grep -P 'if.*?\d' "$f"`" )
        echo "wow $line is an amazing arithmetic condition"
    end
endif

给我:

$ echo in | csh a.csh 
Using file: in
wow if (42 > 666) { is an amazing arithmetic condition

与输入一起使用时:

$x = 'foo';

if ($foo) {
    print('bar');
}

if (42 > 666) {
    print('FizzBuzz!');
}

另请注意,我在"命令中添加了grep引号周围的引号 - 您可以通过阅读foreach中的csh(1)文档来了解原因;-)