[英]AWK arguments vs file
假設我有兩段代碼:
awk ' BEGIN {for (i=0; i<ARGC-1; i++) {printf "ARGV[%d] = %s\n", i, ARGV[i]}} {print "So as you can see, complications can occur."} ' one two three four
除非目錄中有一個名為“ one
的文件,否則這部分內容將無法工作。
awk ' BEGIN {for (i=0; i<ARGC-1; i++) {printf "ARGV[%d] = %s\n", i, ARGV[i]}}' one two three four
這將正常工作,並且one two three four
將被理解為參數。 那么,為什么前者不起作用? 是什么讓awk認為文件中有某些內容而參數中有某些內容? 謝謝。
在運行任何BEGIN
塊之后,如果還有任何剩余代碼,則它在輸入的每一行中運行一次-這意味着awk
必須讀取其輸入。 如果awk
去讀取輸入時ARGV
有任何內容,它將被解釋為要打開和讀取的文件的列表; 否則,將改為讀取標准輸入。
在您的例子中, print
是提到並發症行不是內部BEGIN
塊,所以它不會被運行,直到awk
讀取輸入行-它會嘗試從文件做one
,因為它的第一個參數。
如果要將參數傳遞給AWK程序而不將其視為文件名,則可以; 如果您在BEGIN
塊之外也有任何代碼,請確保不要將它們留在ARGV
:
awk 'BEGIN {
for (i=0; i<ARGC-1; i++) {printf "ARGV[%d] = %s\n", i, ARGV[i]};
delete ARGV}
{print "So as you can see, complications can occur."}' one two three four
上面將打印出消息,然后在標准輸入上等待一行。 收到任何行后,它將打印出有關並發症的消息。
如果您只希望AWK程序執行其工作而不嘗試讀取和處理任何輸入-撇開AWK可能是該情況的一個奇怪選擇-只需將所有代碼放入一個或多個BEGIN
塊中即可。 如果awk
完成了BEGIN
塊並沒有找到其他代碼,它將退出而不嘗試讀取任何輸入。
awk
需要有效的輸入數據(來自文件或標准輸入)來執行BEGIN
塊之外的代碼。 在第一個代碼段中,您在BEGIN
之外有一條print
語句,如果給awk
一些有效的輸入(即使為空),該語句也會執行。 但是,如果您的輸入文件不存在,則awk將返回此錯誤:
fatal: cannot open file `one' for reading (No such file or directory)
第二個代碼段在沒有有效輸入的情況下有效,因為您只有BEGIN
塊內有代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.