我有兩個相同的文本檔案 a.text 和 b.text 具有相同的內容。
a.text 和 b.text 的內容
abcd
target
efgh
任何人都可以解釋為什么其中一個命令有效而另一個無效,以及是否有辦法使其作業?
命令 1 的輸出
grep "target" {a,b}.text
>>a.text:target
b.text:target
命令 2 的輸出
file="{a,b}.text"
grep "target" $file
>>grep: {a,b}.text: No such file or directory
如果有人能給我指出一個我也可以閱讀更多相關資訊的位置,我會很高興。我只能假設,當將它存盤為變數時,它會明確查找名為 {a,b}.text 的檔案,但我不確定是為什么以及導致這種情況的原因。
uj5u.com熱心網友回復:
在第一種情況下,您有一個大括號擴展。在第二種情況下,您正在搜索具有文字名稱的檔案{a,b}.text。原因是在 bash 中,大括號擴展發生在引數擴展之前。
uj5u.com熱心網友回復:
正如user1934428 所說,大括號擴展發生在引數擴展之前。參考bash 手冊:
拆分成單詞后在命令列上進行擴展。執行的擴展有七種:大括號擴展、波浪號擴展、引數和變數擴展、命令替換、算術擴展、分詞和路徑名擴展。
擴展的順序是:大括號擴展、波浪號擴展、引數、變數和算術擴展以及命令替換(以從左到右的方式完成)、分詞和路徑名擴展。
要使其作業,您可以將檔案名存盤在陣列中。陣列可以保存多個檔案名,而不會受到困擾普通字串變數的參考或擴展問題的影響。
files=({a,b}.text)
grep "target" "${files[@]}"
這是有效的,因為{a,b}現在在分配變數時進行評估,而不是在擴展時進行評估。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/358763.html
