如何讓變數的展開推遲

2021-07-05 21:53:11 字數 879 閱讀 4191

其實作為剛學shell的菜鳥,我不知道這個題目總結得對不對。但是就實踐來說,的確是沒有問題的。

我最近在寫的乙個指令碼是在clearcase的vob裡去查詢一些element。如果要查詢vob裡的檔案,就需要有view。在指令碼裡,如果setview,就會fork乙個子程序。為了避免這個,clearcase提供了乙個命令:cleartool setview -exec "command" [view_tag]。

我當時是要在上面的command裡從乙個檔案讀入element,然後執行相應的操作。一開始是這樣寫的

func1()

cleartool setview -exec "while read line;do cleartool desc -l $line;fi;done << $1" view_tag

func1 element_list

執行中發現,當呼叫func1的時候,$line並沒有按照預想的取得element_list裡相應的每一行的內容,而是空的。

修改之後,能正確執行的指令碼如下:

func1()

cleartool setview -exec "while read line;do cleartool desc -l \$line;fi;done << $1" view_tag  #就是在$line前加了乙個轉義的\

func1 element_list

究其原因,大概是因為shell是解釋性的語言,它在執行語句前,會先把變數進行擴充套件。但是因為$line要在while迴圈中才能賦值,所以如果不轉義$line,就只能得到乙個空值。當轉義之後,就是告訴shell,這個變數的值要到while迴圈才擴充套件。

暫時我還沒有在abs文件找到相應的解釋。如果某天看到了,再來更新這裡。

感謝ace_fei和chris_li兩位大俠的指教。

變數的推遲定義

c語言中變數要放在模組頭部定義的規定 但在c 中,還是取消這種做法吧,它沒必要,不自然,而且昂貴。如果定義了乙個有建構函式和析構函式的型別的變數,當程式執行到變數定義之處時,必然面臨構造的開銷 當變數離開它的生命空間時,又要承擔析構的開銷。這意味著定義無用的變數必然伴隨著不必要的開銷,所以只要可能,...

盡可能地推遲變數的定義

是的,我們同意c語言中變數要放在模組頭部定義的規定 但在c 中,還是取消這種做法吧,它沒必要,不自然,而且昂貴。還記得嗎?如果定義了乙個有建構函式和析構函式的型別的變數,當程式執行到變數定義之處時,必然面臨構造的開銷 當變數離開它的生命空間時,又要承擔析構的開銷。這意味著定義無用的變數必然伴隨著不必...

條款32 盡可能地推遲變數的定義

此函式太早定義了變數 encrypted string encryptpassword const string password 進行必要的操作,將口令的加密版本 放進encrypted之中 return encrypted 物件encrypted在函式中並非完全沒用,但如果有異常丟擲時,就是無用...