Bash
帶有空格和萬用字元的路徑的字元串的 Bash 腳本錯誤
我無法掌握 Bash 腳本的基礎知識。這是我到目前為止所擁有的:
#!/bin/bash FILES="/home/john/my directory/*.txt" for f in "${FILES}" do echo "${f}" done
我想做的就是
.txt
在一個循環中列出所有文件,for
這樣我就可以對它們做一些事情了。但是 中的空間my directory
和中的星號*.txt
並沒有很好地發揮作用。我嘗試使用帶和不帶雙引號的它,在變數名上帶和不帶花括號,但仍然無法列印所有.txt
文件。這是一個很基礎的事情,但我還在掙扎,因為我累了,想不通。
我究竟做錯了什麼?
如果我的 FILES 沒有空格或星號,我已經能夠成功應用上面的腳本……我必須嘗試使用或不使用雙引號和大括號才能使其正常工作。但是,當我同時擁有空格和星號時,一切都搞砸了。
在引號內,
*
不會擴展為文件列表。要成功使用這樣的萬用字元,它必須在引號之外。即使萬用字元確實展開了,表達式
"${FILES}"
也會產生單個字元串,而不是文件列表。一種可行的方法是:
#!/bin/bash DIR="/home/john/my directory/" for f in "$DIR"/*.txt do echo "${f}" done
在上面,帶有空格或其他難字元的文件名將被正確處理。
更高級的方法可以使用 bash 數組:
#!/bin/bash FILES=("/home/john/my directory/"*.txt) for f in "${FILES[@]}" do echo "${f}" done
在這種情況下,
FILES
是一個文件名數組。定義周圍的括號使其成為一個數組。請注意,在*
引號之外。該構造"${FILES[@]}"
是一種特殊情況:它將擴展為字元串列表,其中每個字元串都是文件名之一。帶有空格或其他難讀字元的文件名將得到正確處理。