Csh

csh 腳本中的“@”字元是什麼意思

  • May 13, 2019

我正在翻譯一個 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_linesfrom的值../config.txt

引用自:https://unix.stackexchange.com/questions/518342