我正在将 csh 脚本翻译为 bash,遇到了一行看起来像
@ lines = `grep num_lines ../config.txt | awk '{printf("%d",int($2))}' `
“@”在这里有什么作用?我找到了一些文档声明 csh 使用“@”作为表达式。然而,这对我来说看起来像是一个正常的变量赋值。当我在 bash 中运行代码的 grep 和 awk 部分时,输出是一个前面带有“%d”的整数,例如“%d 12045”。
答案1
好吧,不可能知道该脚本的作者在想什么。但这里有一些观察结果:
- 如果该
awk
命令确实显示printf
,那么它将打印输入行上第二个字符串的整数值。 - 作为罗艾玛 评论正如我所评论的那样,
awk
它是一个非常强大的程序。您几乎不需要将它与grep
、sed
或另一个结合起来运行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