問題:
是否可以存取目前正在處理的 bash 迭代次數?
偽指令
mv {1..5}.something.{1..5} $x1.$x2.something
- 注意:這是一個邏輯表示;非工作樣本。
偽輸出
mv 1.something.1 1.1.something
mv 1.something.2 1.2.something
...
mv n.something.m n.m.something
- 其中 n 和 m 都是它們各自大括號擴展的迭代。
說明
我熟悉循環,例如:
for x in {1..10}; do echo -n "$x "; done
正如您所看到的,bash 將迭代設為 $x。我希望了解是否可能,以及當我沒有定義要使用哪個變數時如何存取 bash 使用的變數。當 bash 被賦予大括號擴展如果沒有要迭代的變量,它必須以某種方式[內部]這樣做。我希望這個變數可以在腳本運行時存取。
感謝所有參與的人#bash
答案1
您誤解了大括號擴展的工作原理。請重新閱讀丹尼斯威廉森上面的評論。
您認為當我編寫 時mv foo.{1,2,3} bar
,shell 實際上多次調用該命令,就好像您輸入了:
mv foo.1 bar
mv foo.2 bar
mv foo.3 bar
如果這是真的,那麼你的問題就有意義了:shell 正在執行多個命令,因此它必須保留一個清單。
但是,事實並非如此。支架擴張擴張一個論點然後調用生成的命令行一度。因此,對於上面的範例,shell 看到參數foo.{1,2,3}
包含大括號擴展,並將該參數擴展為三個參數foo.1 foo.2 foo.3
。然後它將擴充功能插入到命令列中代替大括號參數,然後繼續解析命令列。完成後,shell 會執行一個指令,如下所示:
mv foo.1 foo.2 foo.3 bar
所以是的,可能當shell 擴展該大括號參數時,它會保留一個列表,但是在其他參數的擴展中無法訪問該列表,因為大括號擴展已完全完成,並且有關擴展的所有信息都已用完並被遺忘解析其他參數的時間。
無論如何,這樣的參數唯一有用的方法是 shell 正在執行多個命令,但事實並非如此。要運行多個命令,您必須使用真正的循環;大括號擴充不會這樣做。
至於$_
,這是一個 Perl 構造,可以用來代替循環變數(就像x
在循環範例中一樣),因此它與大括號擴展並不真正相關。
答案2
具體來說mv
,您可以簡單地使用該-v
標誌來查看當前正在處理的內容。正如@DennisWilliamson 指出的那樣,沒有為大括號擴展序列設定變數 -writingecho {1..5}
等同於writing echo 1 2 3 4 5
。比較echo "$foo"
- 事後無法知道哪個變數被echo
編輯了。
答案3
為什麼不使用自己的變數來計算迭代次數並回顯它。如果您想查看執行過程中發生了什麼,請使用 -x 選項來執行它。就像 bash -x 會告訴你 ex 的位置。但如果不具體說明您想要實現的目標,就很難提供協助。