如何获取文件夹文件名数组?求解释Bash脚本代码含义
嘿,作为刚接触Bash的新手,看不懂这段脚本太正常啦!我来一步步给你拆明白,顺便还能给你优化成更符合你需求的写法~
先拆解你找到的这段脚本
先把原脚本贴出来方便对照:
declare -a FILELIST for f in *; do FILELIST[${#FILELIST[@]}+1]=$(echo "$f") done echo ${FILELIST[@]}
咱们逐行拆解:
declare -a FILELIST:这行是告诉Bash,FILELIST是一个索引数组变量,专门用来存一系列字符串(这里就是文件名)。如果不声明,Bash也能自动识别数组,但显式声明会更清晰。for f in *; do ... done:这是Bash的遍历循环,*是通配符,代表当前目录下所有非隐藏的文件和文件夹。每次循环会把一个文件名赋值给变量f,然后执行循环体里的命令。FILELIST[${#FILELIST[@]}+1]=$(echo "$f"):这行是给数组加元素,但有个小问题:${#FILELIST[@]}:@代表数组里的所有元素,#是取数组的元素个数。比如数组现在有2个元素,这个值就是2。${#FILELIST[@]}+1:把元素个数加1当新索引,这会导致数组的第0位是空的!比如4个文件的话,数组索引会是1、2、3、4,完全不符合你要的“0-3对应4个文件”的需求。=$(echo "$f"):把当前遍历到的文件名f赋值给数组的这个索引位置,其实这里echo是多余的,直接写"$f"就行。
echo ${FILELIST[@]}:${FILELIST[@]}会展开数组里的所有元素,echo就是把这些元素打印出来,用空格分隔。
符合你需求的正确写法(索引从0开始)
其实Bash数组有更简单的追加元素方式,不用手动算索引:
# 先切换到目标文件夹folder1(如果当前不在这个目录的话) cd folder1 # 声明数组并遍历赋值,自动从0开始索引 declare -a FILELIST for f in *; do FILELIST+=("$f") # 用+=直接把元素追加到数组末尾,自动用下一个连续索引(从0开始) done # 验证结果 echo "数组里的所有文件名:${FILELIST[@]}" echo "第0个文件:${FILELIST[0]}" echo "第3个文件:${FILELIST[3]}"
甚至还有更简洁的一行写法,直接把所有文件名存入数组:
cd folder1 FILELIST=(*) # 直接用通配符*赋值给数组,自动按顺序存入,索引从0开始,完美符合你的需求!
补充几个实用小细节
- 如果要包含隐藏文件(以
.开头的文件),可以先执行shopt -s dotglob开启隐藏文件匹配,再执行上面的数组赋值命令。 - 如果只想存普通文件(排除文件夹),可以用带判断的循环:
cd folder1 declare -a FILELIST for f in *; do if [[ -f "$f" ]]; then # -f 判断当前f是否是普通文件 FILELIST+=("$f") fi done
内容的提问来源于stack exchange,提问作者mark Franz
相关产品推荐
相关产品推荐

