bash:附加数组

  • 本文关键字:数组 bash bash
  • 更新时间 :
  • 英文 :


请注意,这只是说明问题的伪代码:

目录结构:

# tree
.
├── dir1
│   ├── d1_file1
│   ├── d1_file2
│   └── d1_file3
└── dir2
    ├── d2_file1
    ├── d2_file2
    └── d2_file3
2 directories, 6 files

脚本:

#!/bin/bash
list=(
dir1
dir2
)
for dir in ${list[@]}; do
    ls -1 ./tmp/${dir} | while read -a file; do
    files+=(${file})
    echo "${dir} has ${#files[@]} files(s)"
    echo "${dir} files: ${files[@]}"
    done
done

当前输出:

# bash tmp.sh 
dir1 has 1 files(s)
dir1 files: d1_file1
dir1 has 2 files(s)
dir1 files: d1_file1 d1_file2
dir1 has 3 files(s)
dir1 files: d1_file1 d1_file2 d1_file3
dir2 has 1 files(s)
dir2 files: d2_file1
dir2 has 2 files(s)
dir2 files: d2_file1 d2_file2
dir2 has 3 files(s)
dir2 files: d2_file1 d2_file2 d2_file3

所需的结果:

# bash tmp.sh
dir1 has 3 files(s)
dir1 files: d1_file1 d1_file2 d1_file3
dir2 has 3 files(s)
dir2 files: d2_file1 d2_file2 d2_file3

基本上,我想为for loop中的每个项目构建一个单独的数组,该数组存储从ls命令中存储值。

为了使每个目录的计数一次输出一次,您需要将打印移出while read循环。但是,我建议完全删除它。尝试这样的事情:

#!/bin/bash
list=(
dir1
dir2
)
for dir in "${list[@]}"; do
    files=( ./tmp/"$dir"/* )
    echo "${dir} has ${#files[@]} files(s)"
    echo "${dir} files: ${files[@]}"
done

这使用一个环将files数组填充每个目录的内容。

通常,应避免解析ls

您可以简单地使用PathName扩展(Globbing)捕获子目录中的所有文件:

list=(
 dir1
 dir2
)
for dir in "${list[@]}"; do
    files=( ./tmp/"${dir}"/* )  # collect all matches in array
    echo "${dir} has ${#files[@]} files(s)"
    echo "${dir} files: ${files[@]}"
done

请注意我如何双重引用的${list[@]}${dir}来保护其值免受外壳的扩展。
相比之下, * 必须 be 无引用,以触发路径名的扩展。

相关内容

  • 没有找到相关文章

最新更新