Bash

帶有空格和萬用字元的路徑的字元串的 Bash 腳本錯誤

  • September 4, 2020

我無法掌握 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[@]}"是一種特殊情況:它將擴展為字元串列表,其中每個字元串都是文件名之一。帶有空格或其他難讀字元的文件名將得到正確處理。

引用自:https://unix.stackexchange.com/questions/156534