我是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
答案 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)
文档来了解原因;-)