2017-06-02 223 views

回答

3

其分解:

  • *\ *是文件名glob模式。這擴展到當前目錄中的所有文件中都有空格。通常會將參數與命令分開(這會在全局擴展之前發生),但在使其成爲文字空間並因此成爲全局模式的一部分之前有一個轉義。

  • for f in *\ *;是一個for循環,循環遍歷in之後的所有內容 - 在這種情況下,glob擴展的文件列表。變量f將依次設置爲每個文件名,並且將爲每個文件名執行直至done命令的代碼。

  • "$f"是一個變量擴展。變量擴展之前字拆分(不像glob擴展),所以引號是必要的,以保持文件名中的空格togther作爲單個參數的一部分,而不是分成多個參數。

  • ${f// /_}是一個帶替代的變量擴展。最初的//表示該模式重複應用於變量內容,而不僅僅是一次。 / /之間的空格是要搜索的模式,最後的_是替換,因此f(循環中的文件名)中的所有空格都將替換爲下劃線。

+0

哇,謝謝!我們中有些人正在試圖打破這種情況,但從未見過這樣的命令。 – Ambrose

1

要了解此代碼,您可能需要了解更多關於globbing和Bash parameter expansion的信息。

  • *\ * =>是匹配在當前目錄中具有一個以上的空間在他們
  • ${f// /_} =>擊參數擴展替換用-空間在可變f(1所有條目中的glob:1更換)

因此,循環於當前目錄(文件,目錄,在其名稱中含有空格,並將其重命名爲到位的空間使用_名稱符號鏈接等)拿起所有條目。

0

令人困惑的擴展是參數替換。表格${foo/bar/baz}用於搜索$foo中的字符串bar,並用baz替換它。如果bar/開頭(如循環中的情況),則全部出現的bar被替換爲baz。有關更多信息,您可以閱讀bash手冊頁中的Parameter Expansion標題。

相關問題