awk向指令碼傳遞引數(二)

2021-09-07 13:35:42 字數 1144 閱讀 8745

命令列引數的乙個重要限制是它們在begin過程中是不可用的。也就是說,直到首行輸入完畢以後它們才可用。為什麼?這是乙個easy混亂的部分。

從命令列傳遞的引數就好像檔名稱一樣被處理。

賦值操作知道這個變數(假設它是乙個檔名稱)被求值時才進行。

參閱以下的指令碼。該指令碼將變數n設定為乙個命令列引數。

awk 

' begin

if (n == 1) print "reading the first file"

if (n == 2) print "reading the second file"

}' n

=1 test n

=2 test2

這裡有4個命令列引數: "n=1 "、"test" 、"n=2 "和"test2"。假設你如今還記著begin過程即"在處理輸入之前所要做的",你將會理解為什麼在begin過程中的引數n返回值為空,因此print語句將列印乙個空行。假設第乙個引數是乙個檔案而不是乙個變數賦值。

該檔案會知道begin過程執行後才被開啟。

第乙個引數為變數n賦初值1 ,第二個引數提供了檔名稱。

因此,對於test中的每一行。條件"n==1 "都為真。在讀完test中的全部行之後,計算第三個引數,並將n賦值為2 。最後,第四個引數提供了第二個檔名稱。

這時在主過程中的條件"n==2"為真。

以這樣的方法對引數求值的後果是不能用begin過程測試或檢驗命令列提供的引數。

僅僅有當輸入一行後它們才可以使用。要了解這樣的侷限性,可以通過編寫規則"nr==1"並使用它的過程來檢驗引數的賦值。

還有乙個方法是在呼叫awk之前在shell指令碼中測試命令列引數。

posix awk提供了乙個解決問題的方法。即在不論什麼輸入被讀入前定義引數。用-v選項指定要在執行begin 過程之前得到變數賦值(也就是。在讀入第乙個輸入行之前)。

-v選項必須在乙個命令列指令碼前說明。比如:下列命令使用-v選項為多行記錄設定記錄分隔符。

$ awk 

-f'\n" -v rs="" '

' phones.block

每乙個傳遞給程式的變數賦值都須要乙個不同的-v選項。

和c程式語言類似,awk也提供系統變數argc和ar**。由於這須要了解陣列,我們將在第八幸"條件、迴圈和陣列"中討論這些特點。

向指令碼傳遞引數

start 在需要的時候我們可以向 perl 指令碼傳遞引數,perl 會自動將所有的引數放到陣列 argv 中,下面是乙個簡單的例子。usr bin perl use strict if argv 1 my name argv print welcome name n unix 的 cat 命令可...

向指令碼傳遞引數

1.使用 pg opt.sh bin sh opt.sh usage opt 1 processid 1 if ne 2 then usage exit 1 ficase opt in start start echo starting.processid stop stop echo stoppi...

shell 向 awk 傳遞變數引數

本文翻譯自stackoverflow提問 how do i use shell variables in an awk script?但更改了文章段落結構和部分表述。使用 v選項 p.s.記得在選項和變數名之間加上空格 variable line one nline two awk v var va...