附加到数组并保留循环外的变量

  • 本文关键字:循环 变量 保留 数组 bash
  • 更新时间 :
  • 英文 :


请注意,这是说明问题的伪代码。例如,我只是使用ls,我知道我不应该解析LS的输出。原始脚本用于通过AWS S3存储桶进行迭代。

目录结构:

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

所需的结果:

# bash tmp.sh
dir1 has 2 files(s)
dir1 files: d1_file1 d1_file2
dir2 has 2 files(s)
dir2 files: d2_file1 d2_file2
Warnings: 2

命令分组 - 文件正确列出了,但是WARNING变量由于管道创建的子壳而丢失。

#!/bin/bash
WARNING=0
list=(
dir1
dir2
)
for dir in ${list[@]}; do
    ls -1 ./tmp/${dir} |
    {
    while read -a file; do
       files+=(${file})
    done
    echo "${dir} has ${#files[@]} files(s)"
    echo "${dir} files: ${files[@]}"
    if [ ${#files[@]} -gt 1 ]; then
        (( WARNING++ ))
    fi
}
done
echo "Warnings: ${WARNING}"
----- Output -----
dir1 has 2 files(s)
dir1 files: d1_file1 d1_file2
dir2 has 2 files(s)
dir2 files: d2_file1 d2_file2
Warnings: 0

过程替代 -WARNING变量在循环外保留,但输出不正确。

#!/bin/bash
WARNING=0
list=(
dir1
dir2
)
for dir in ${list[@]}; do
    while read -a file; do
       files+=(${file})
    done  < <(ls -1 ./tmp/${dir})
    echo "${dir} has ${#files[@]} files(s)"
    echo "${dir} files: ${files[@]}"
    if [ ${#files[@]} -gt 1 ]; then
        (( WARNING++ ))
    fi
done
echo "Warnings: ${WARNING}"
----- Output -----
dir1 has 2 files(s)
dir1 files: d1_file1 d1_file2
dir2 has 4 files(s)
dir2 files: d1_file1 d1_file2 d2_file1 d2_file2
Warnings: 2

在这里文档 - 此处警告的输出和数量不正确

#!/bin/bash
WARNING=0
list=(
dir1
dir2
)
for dir in ${list[@]}; do
    while read -a file; do
       files+=(${file})
    done  <<<$(ls -1 ./tmp/${dir})
    echo "${dir} has ${#files[@]} files(s)"
    echo "${dir} files: ${files[@]}"
    if [ ${#files[@]} -gt 1 ]; then
        (( WARNING++ ))
    fi
done
echo "Warnings: ${WARNING}"
----- Output -----
dir1 has 1 files(s)
dir1 files: d1_file1
dir2 has 2 files(s)
dir2 files: d1_file1 d2_file1
Warnings: 1

您可以建议我应该使用哪种方法来获得所需的结果,以及在我的情况下实际推荐的方法。

不工作的原因

Command grouping

正如您所说的那样,警告由于子壳而丢失,但文件数组的外观也是如此。

Process Substitution

与子壳不同,文件数组不是重置,因此每个后续循环/目录仍然包含上一个文件中的文件。

Here Document

错误地添加到数组中,仅在一次文档中输出LS的方式,一次仅添加一个文件。


解决方案

您可以使用流程替代,只重置

之类的循环之间的数组
#!/bin/bash
WARNING=0
list=(
dir1
dir2
)
for dir in ${list[@]}; do
    {
    while read -a file; do
       files+=(${file})
    done < <(ls -1 tmp/${dir})
    echo "${dir} has ${#files[@]} files(s)"
    echo "${dir} files: ${files[@]}"
    if [ ${#files[@]} -gt 1 ]; then
        (( WARNING++ ))
    fi
        unset files   ## THIS LINE
}
done
echo "Warnings: ${WARNING}"

这是假设您实际上不想要文件数组,而只想输出它们

p.s不要解析ls;)

相关内容

  • 没有找到相关文章

最新更新