当我在 bash 中声明一个数组时,$ ARRAY=('ele1' ele2')我可以使用$ ARRAY+=('ele3').
echo ${ARRAY[@]}
ele1 ele2 ele3
Run Code Online (Sandbox Code Playgroud)
但是,在 while 循环中的脚本中,我无法使其正常工作:
FOUNDFILES=$(ls -lA)
LINE_CNT=1
ARRAY=()
echo -e "$FOUNDFILES" | while read line
do
ARRAY+=("test")
LINE_CNT=$((LINE_CNT+1))
done
echo "${ARRAY[@]}"
echo $LINE_CNT
Run Code Online (Sandbox Code Playgroud)
LINE_CNT变量提供了找到的文件数量,但我的数组保持为空。我究竟做错了什么?
一些东西:
不要假设find每行只输出一个文件名;在存在包含换行符的文件名时会中断。
不要假设输出的换行符是输出find中唯一的空格。
find当 glob 可以使用时,根本不要使用。
shopt -s globstar
foundfiles=(./**/"$1")
declare -a array
line_cnt=1
for f in "${foundfiles[@]}"; do
array+=(test)
line_count=$((line_count + 1))
done
Run Code Online (Sandbox Code Playgroud)
如果您的调用find比 glob 可以处理的更复杂,并且您的版本find可以输出空分隔的文件名,请使用
# -d for readarray was introduced in bash 4.4; earlier versions
# require something more complex; see Gordan Davidson's answer at
# /sf/answers/78466671/
readarray -t -d $'\0' < <(find . ... -name "$1" -print0)
Run Code Online (Sandbox Code Playgroud)
如果你find不不支持输出空分隔的文件名,重新考虑在写这篇bash。(您可以考虑使用zsh,它具有更丰富的 glob 功能集,可以消除您原本需要 的许多情况find。)