csh 脚本中“@”字符的含义是什么

csh 脚本中“@”字符的含义是什么

我正在将 csh 脚本翻译为 bash,遇到了一行看起来像

@ lines = `grep num_lines ../config.txt | awk '{printf("%d",int($2))}' `

“@”在这里有什么作用?我找到了一些文档声明 csh 使用“@”作为表达式。然而,这对我来说看起来像是一个正常的变量赋值。当我在 bash 中运行代码的 grep 和 awk 部分时,输出是一个前面带有“%d”的整数,例如“%d 12045”。

答案1

好吧,不可能知道该脚本的作者在想什么。但这里有一些观察结果:

  • 如果该awk命令确实显示printf,那么它将打印输入行上第二个字​​符串的整数值。
  • 作为罗艾玛 评论正如我所评论的那样, awk它是一个非常强大的程序。您几乎不需要将它与grepsed或另一个结合起来运行awk。所以
    grep num_lines文件名| awk '{ printf("%d", int($2)) }'
    可以写成
    awk '/num_lines/ { printf("%d", int($2)) }'文件名
  • 正如我上面提到的,int($2)给你整数部分 输入行第二个字符串的值。因此,如果配置文件显示num_lines   foo,您将得到0.如果它说num_lines   3.14,你就会得到3。对于格式良好的配置文件,您似乎不需要采取此类预防措施。
  • 任何状况之下,
    printf("%d", int($2))
    太过分了。据我所知,
    printf("%d", $2)
    打印整数($2)
    (几乎)完全相同。
  • 我可以识别的一个区别是该printf版本不会在末尾写入换行符:
    $ echo "num_lines 42" | awk '{printf("%d", $2)}';日期
    422019年5月13日星期一 12:00:00 AM
     
    $ echo "num_lines 42" | awk '{print int($2)}';日期
    42
    2019 年 5 月 13 日星期一 12:00:01 上午
    但这并不真正相关,因为`…`去掉了尾随的换行符。
  • 你说“这对我来说看起来像是一个正常的变量赋值”。但 [t]csh 的用户知道它不允许
    多变的=价值
    你不得不说
     多变的=价值
    或者
    @ 多变的=表达式
    当然,简单的整数常量是有效的expr, 所以作者可能只是使用@而不是set 因为它更短并且他们知道该值是一个整数。

所以该语句将变量设置为fromlines的值。num_lines../config.txt

相关内容