訪問 bash [內部] 大括號擴展迭代次數/變量

訪問 bash [內部] 大括號擴展迭代次數/變量

問題:

是否可以存取目前正在處理的 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 的位置。但如果不具體說明您想要實現的目標,就很難提供協助。

相關內容