我想在陣列把結果命令find *.txt
,然後遍歷數組了這樣申報陣列find命令的結果
for file in array
do
done
我需要把數組,因爲以後我需要訪問到陣列。所以解決方案
for file in `find *.txt`
do
done
對我不好。
我想在陣列把結果命令find *.txt
,然後遍歷數組了這樣申報陣列find命令的結果
for file in array
do
done
我需要把數組,因爲以後我需要訪問到陣列。所以解決方案
for file in `find *.txt`
do
done
對我不好。
使用數組賦值語法:
array=($(find *.txt))
如果可以有空格的文件名,你應該把
IFS=$"\n"
上面的命令。如果文件名中可能有換行符,它會變得非常複雜,我不知道處理它的好方法。
然後你可以迭代它具有:
for file in "${array[@]}"
讓我們希望文件名中沒有空格......希望和祈禱!你膽大妄爲! –
如果你確定你沒有任何的換行符在你的文件名,mapfile
是一個不錯的選擇:
mapfile -t array < <(find . -name '*.txt')
現在,如果你想要更多的東西防彈,你可以使用:
mapfile -t array < <(find . -name '*.txt' -exec bash -c 'printf "%q\n" "${@:0}"' {} +)
eval array=(${array[@]})
看到最後一行:eval
和未加引號${array[@]}
,您應該感覺非常糟糕。它的工作原理是防彈的,因爲array
是使用printf
的'%q'修飾符構建的,所以一切都很好地轉義或引用,以便在這裏安全使用!
對於'printf'%q \ n「'的很好的使用+1 – John1024
其他答案都有美德。作爲一種補充,在這裏是一種方法,其中(a)是即使在最困難的文件名安全,(二)允許充分利用find
的力量,以及(c)避免eval
:
array=()
while read -r -d $'\0'; do
array+=("$REPLY")
done < <(find . -name '*.txt' -print0)
你爲什麼使用'find'? 'find * .txt'和'* .txt'之間沒有區別,除非你有名稱以'.txt'結尾的子目錄。你的意思是'發現。 -name'* .txt''? – Barmar