if-else代码中的csh awk语法错误

if-else代码中的csh awk语法错误,awk,csh,Awk,Csh,我有以下脚本: #!/bin/csh echo "jones 2143 78 84 77" >! student-marks echo "Gondrol 2243 88 94 87" >> student-marks awk '{ if ($3 >=35 && $4 >= 35 && $5 >= 35) print $0,"=>","Pass"; else print $0,"=>","Fail";

我有以下脚本:

#!/bin/csh
echo "jones 2143 78 84 77" >! student-marks
echo "Gondrol 2243 88 94 87" >> student-marks

awk '{
if ($3 >=35 && $4 >= 35 && $5 >= 35)
    print $0,"=>","Pass";
else
    print $0,"=>","Fail";
}' student-marks
这是我直接从URL复制的

以了解如何将if-else逻辑与awk结合使用为例。不幸的是,我一直得到不匹配的错误'
有什么建议吗?

csh
更改为
sh
bash

#!/bin/sh
...

Csh处理多行引号字符串的方式与Posix shell不同。

Csh
更改为
sh
bash

#!/bin/sh
...
Csh处理多行引号字符串的方式与Posix shell不同。

正确的是,Csh处理多行引号字符串的方式与Posix shell不同,使用
sh
bash
可能更容易
csh
通常被认为是一个糟糕的脚本选择(尽管有些人更喜欢它,尤其是它的
tcsh
变体,用于交互式使用)

有关使用
csh
编写脚本的问题的讨论,请参阅

但是使用csh可以做你想做的事情。您只需在多行带引号的字符串中的每行末尾添加一个反斜杠:

#!/bin/csh -f
echo "jones 2143 78 84 77" >! student-marks
echo "Gondrol 2243 88 94 87" >> student-marks

awk '{\
if ($3 >=35 && $4 >= 35 && $5 >= 35)\
    print $0,"=>","Pass";\
else\
    print $0,"=>","Fail";\
}' student-marks
输出:

jones 2143 78 84 77 => Pass
Gondrol 2243 88 94 87 => Pass
我又偷偷地做了一个小改动:将
-f
选项添加到
#行。这将防止
csh
加载任何资源或启动文件,因此脚本(a)将启动得更快,并且(b)将避免意外依赖您自己的
.cshrc
登录文件。(这不适用于
sh
bash
脚本;对于这些shell,
-f
选项具有完全不同的含义。)

正确的是,csh处理多行引号字符串的方式与POSIX shell不同,使用
sh
bash
可能更容易
csh
通常被认为是一个糟糕的脚本选择(尽管有些人更喜欢它,尤其是它的
tcsh
变体,用于交互式使用)

有关使用
csh
编写脚本的问题的讨论,请参阅

但是使用csh可以做你想做的事情。您只需在多行带引号的字符串中的每行末尾添加一个反斜杠:

#!/bin/csh -f
echo "jones 2143 78 84 77" >! student-marks
echo "Gondrol 2243 88 94 87" >> student-marks

awk '{\
if ($3 >=35 && $4 >= 35 && $5 >= 35)\
    print $0,"=>","Pass";\
else\
    print $0,"=>","Fail";\
}' student-marks
输出:

jones 2143 78 84 77 => Pass
Gondrol 2243 88 94 87 => Pass

我又偷偷地做了一个小改动:将
-f
选项添加到
#行。这将防止
csh
加载任何资源或启动文件,因此脚本(a)将启动得更快,并且(b)将避免意外依赖您自己的
.cshrc
登录文件。(这不适用于
sh
bash
脚本;对于这些shell,
-f
选项具有完全不同的含义。)

请参见下面的答案。请注意,您可以让您的
awk
稍微有些尴尬:
awk'$3>=35&&$4>=35&&$5>=35{print$0,“=>”,“Pass”;next}{print$0,“=>”,“Fail”}文件
。默认为有罪。您可以使用三元运算符将其转换为awk一行:
awk'{print$0,=>,($3>=35&&&$4>=35&&$5>=35)-“通过”:“失败”}学生分数
请参见以下答案。请注意,您可以让您的
awk
稍微有些尴尬:
awk'$3>=35&&$4>=35&&$5>=35{print$0,“=>”,“Pass”;next}{print$0,“=>”,“Fail”}文件
。默认为有罪。您可以使用三元运算符将其转换为awk一行:
awk'{print$0,=>,($3>=35&&&$4>=35&&$5>=35)?“通过”:“失败”}学生分数