我試圖編寫一個腳本,該腳本在文件列表上工作。如果我想在同一個目錄中的所有文件工作,然後Bash - 轉換逗號分隔列表
FILES=*.ext
for i in $FILES; do
something on "$i"
done
工程確定,問題是當我想要的工作只是一個選擇的文件,而不是一切。如何將逗號分隔的文件列表(可能包含或不包含空格)轉換爲相同的格式,以便我可以將其保存在$ FILES中並使用相同的代碼?
非常感謝,提前
大衛·肖
我試圖編寫一個腳本,該腳本在文件列表上工作。如果我想在同一個目錄中的所有文件工作,然後Bash - 轉換逗號分隔列表
FILES=*.ext
for i in $FILES; do
something on "$i"
done
工程確定,問題是當我想要的工作只是一個選擇的文件,而不是一切。如何將逗號分隔的文件列表(可能包含或不包含空格)轉換爲相同的格式,以便我可以將其保存在$ FILES中並使用相同的代碼?
非常感謝,提前
大衛·肖
做的是不使用文件名的分隔列表,但使用一個數組(避免大寫變量名)正確的事情,這將避免的問題包含您的分隔符(如,
)文件名和是慣用的做法:
files=(*foo*.ext1 *bar*.ext2 file1 "file 2 with a space")
for file in "${files[@]}"; do
[ -e "${file}" ] || continue
do_something_with "${file}"
done
除非你有過怎樣$files
人口無法控制這是你想要的,如果你的腳本被喂以通訊一個單獨的列表,你完全無法避免它,那麼你可以相應地設置IFS
,如@ BroSlow的answer。
由於globbing在用空格擴展文件名時沒有問題(即使在您的示例中也沒有)。
您可能還想檢查extended globbing (extglob)
以便能夠更具體地匹配。
如果我正確解釋您的問題,您可以將bash中的內部字段分隔符(IFS)改爲逗號,然後用文字分割處理其餘部分(例如,
#!/bin/bash
FILES="file1,file2 with space,file3,file4 with space"
IFS=','
for i in $FILES; do
echo "File = [$i]"
done
這將輸出
File = [file1]
File = [file2 with space]
File = [file3]
File = [file4 with space]
注意,如Adrian Frühwirth pointed out in comments,如果文件名可以包含逗號,這將失敗。
是的,但這不是你如何做到的。你只是改變了問題,現在它會用逗號分隔文件名。 –
@AdrianFrühwirth我仍然在解釋這個問題,因爲他有一個用逗號分隔的文件列表,並且想要遍歷它。如果文件名本身可以包含逗號,那麼問題幾乎無法解決。 – BroSlow
我認爲這是一個XY問題,OP只需要知道他們不應該存儲 - 也不是必需的 - 一個逗號分隔的文件/模式列表。如果你使用一個數組並正確地做,你可以避免所有這些問題。 –
你介意提供一些樣本數據嗎? – Saucier