Csh
csh 腳本中的“@”字元是什麼意思
我正在翻譯一個 csh 腳本來 bash 遇到一行看起來像
@ lines = `grep num_lines ../config.txt | awk '{printf("%d",int($2))}' `
‘@’ 在這裡做什麼?我發現一些文件說明 csh 使用 ‘@’ 表示表達式。但是,這對我來說似乎是一個正常的變數分配。當我在 bash 中執行 grep 和 awk 部分程式碼時,輸出是一個帶有前面“%d”的整數,例如“%d 12045”。
好吧,不可能知道那個劇本的作者在想什麼。但這裡有一些觀察:
- 如果該
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_lines
from的值../config.txt
。