Loibologic Asked: 2019-05-11 15:37:05 +0800 CST2019-05-11 15:37:05 +0800 CST 2019-05-11 15:37:05 +0800 CST csh 脚本中的“@”字符是什么意思 772 我正在翻译一个 csh 脚本来 bash 遇到一行看起来像 @ lines = `grep num_lines ../config.txt | awk '{printf("%d",int($2))}' ` '@' 在这里做什么?我发现一些文档说明 csh 使用 '@' 表示表达式。但是,这对我来说似乎是一个正常的变量分配。当我在 bash 中运行 grep 和 awk 部分代码时,输出是一个带有前面“%d”的整数,例如“%d 12045”。 csh 1 个回答 Voted Best Answer G-Man Says 'Reinstate Monica' 2019-05-13T19:59:02+08:002019-05-13T19:59:02+08:00 好吧,不可能知道那个剧本的作者在想什么。但这里有一些观察: 如果该awk命令确实是printf,那么它将在输入行上打印第二个字符串的整数值。 正如roaima 所评论的那样,正如我所评论的那样, 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) 和打印 int($2)(几乎)完全等价。 我可以确定的一个区别是该printf版本最后没有写换行符: $ echo "num_lines 42" | awk '{printf("%d", $2)}'; 日期 42 2019 年 5 月 13 日星期一 12:00:00 $ echo "num_lines 42" | awk '{print int($2)}'; 日期 42 2019 年 5 月 13 日星期一 12:00:01 AM但这并不重要,因为`…`去掉了尾随的换行符。 你说“这对我来说看起来像是一个正常的变量赋值”。但是 [t]csh 的用户知道它不允许变量=值 你不得不说设置 变量=值 或者@ 变量= expr 当然,一个简单的整数常量是有效的expr, 所以作者可能只是简单地使用@而不是set 因为它更短并且他们知道该值是一个整数。 因此,该语句将lines变量设置为num_linesfrom的值../config.txt。
好吧,不可能知道那个剧本的作者在想什么。但这里有一些观察:
awk
命令确实是printf
,那么它将在输入行上打印第二个字符串的整数值。awk
它是一个非常强大的程序。您几乎不需要将它与grep
,sed
或其他awk
. 所以 可以写int($2)
给你 输入行上第二个字符串的整数部分。所以,如果配置文件说num_lines foo
,你会得到0
. 如果它说num_lines 3.14
,你会得到3
。您似乎不太可能需要对格式良好的配置文件采取此类预防措施。printf
版本最后没有写换行符: 但这并不重要,因为`…`
去掉了尾随的换行符。expr
, 所以作者可能只是简单地使用@
而不是set
因为它更短并且他们知道该值是一个整数。因此,该语句将
lines
变量设置为num_lines
from的值../config.txt
。