【问题标题】:csh awk syntax error in if else codeif else 代码中的 csh awk 语法错误
【发布时间】:2012-11-30 19:57:57
【问题描述】:

我有以下脚本:

#!/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 复制的 http://www.thegeekstuff.com/2010/02/awk-conditional-statements/

作为一个例子来学习如何在 awk 中使用 if else 逻辑。不幸的是,我不断收到错误 Unmatched ' 有什么建议吗?

【问题讨论】:

  • 请看下面的答案。请注意,您可以使您的 awk 更加尴尬:awk '$3 >=35 && $4 >= 35 && $5 >= 35 { print $0,"=>","Pass"; next } { print $0,"=>","Fail" }' file。默认有罪。
  • 您可以使用三元运算符将其变成 awk 单行:awk '{print $0, "=>", ($3 >=35 && $4 >= 35 && $5 >= 35) ? "Pass" : "Fail"}' student-marks

标签: awk csh


【解决方案1】:

csh 更改为shbash

#!/bin/sh
...

Csh 不像 Posix shell 那样处理多行引用的字符串。

【讨论】:

    【解决方案2】:

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

    有关使用csh 编写脚本的问题的讨论,请参阅"Csh Programming Considered Harmful"

    但是使用 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.login 文件。 (这适用于shbash 脚本;对于这些shell,-f 选项具有完全不同的含义。)

    【讨论】:

      猜你喜欢
      • 2015-11-18
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多