對文件掩碼執行循環的正確方法是什麼?bash循環覆蓋文件掩碼
E.g.如果掩碼沒有展開到任何文件,則循環不應該運行;否則,它應該運行它擴展到的所有文件。
與幼稚的做法的問題是,如果*
不會擴展到任何東西,那麼整個循環將彷彿*
部分是文件名的實際部分(實際上不存在的文件運行一次)。要做到這一點
對文件掩碼執行循環的正確方法是什麼?bash循環覆蓋文件掩碼
E.g.如果掩碼沒有展開到任何文件,則循環不應該運行;否則,它應該運行它擴展到的所有文件。
與幼稚的做法的問題是,如果*
不會擴展到任何東西,那麼整個循環將彷彿*
部分是文件名的實際部分(實際上不存在的文件運行一次)。要做到這一點
一種方法是:
for f in abc*; do if [[ -f "$f" ]]; then
# Do something with "$f"
fi; done
這也將篩選出的目錄列表中,這可能會或可能不是你想要的是。
如果要保留目錄,請使用-e
而不是-f
。
另一種方法是設置shell選項nullglob
(可能不適用於所有bash版本)。使用nullglob
集合時,與任何文件名不匹配的模式都不會產生任何改變。
shopt -s nullglob
for f in abc*; do
# do something with $f
done
shopt -u nullglob
(這使得nullglob
設置爲for
循環的持續時間,你可以取消它的循環,而不是等待結束,在每個循環執行shopt -u
的短小的成本里面。)
使用nullglob
外殼選項,以使通配符不匹配任何擴展到什麼,而不是返回通配符本身:
shopt -s nullglob
for file in abc*
do
...
done
_file MASK_?你的意思是通配符模式嗎? – Barmar 2014-09-25 06:14:44