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)?“通过”:“失败”}学生分数