将值添加到数组并基于该值进行循环

将值添加到数组并基于该值进行循环

我有 3 个文件,如下所示:

CV_REF_DATA_09012021.txt
DB_ONLINE_CL_09012021.txt
DFR_CL_INS_09012021.txt

我想检查 /NAS/CFG/ 中是否存在文件,然后将其添加到数组中。并不要求所有 3 个文件始终都存在。因此,它可以是 1 个、2 个或全部 3 个文件。如果没有文件,脚本应该退出并说同样的话。接下来我想基于数组循环并运行“调用”脚本。

调用脚本还使用文件模式来检查文件计数。以下代码来自调用脚本。

NASFilecnt=`find . -type f -name "${CV_REF_DATA}*.txt" | wc -l`

那么,如何根据上述内容运行循环呢?如有任何疑问,请告诉我。

答案1

根据文件的存在,您对想要发生的情况的描述有点模糊。还不清楚您是否希望单独收集每个文件名前缀的名称或一起收集。例如,最好选择一个特定日期,并尝试从中查找文件集。下面的代码应该为您的编程工作提供一些支持。

这个答案将类似于我对你之前的问题我们将循环一组静态字符串来测试包含这些字符串的文件名是否存在。

您可以循环遍历文件名前缀,并在每次迭代中检查是否存在具有该前缀(以及.txt文件名后缀)的任何文件。

for prefix in CV_REF_DATA_ DB_ONLINE_CL_ DFR_CL_INS_; do
        set -- /NAS/CFG/"$prefix"*.txt
        if [ -e "$1" ]; then
                printf 'There exists names matching "%s"*.txt:\n' "$prefix"
                printf '\t%s\n' "$@"
        else
                printf 'No names matches "%s"*.txt\n' "$prefix"
        fi
done

该循环迭代文件名前缀,并且在每次迭代中,我们尝试扩展应该与我们对该前缀感兴趣的文件相匹配的模式。该set命令会将匹配的文件名存储在位置参数列表中("$@";"$1"是该列表的第一个元素)。

bashshell中,我们可以将上面的代码块编写如下。

shopt -s nullglob

for prefix in CV_REF_DATA_ DB_ONLINE_CL_ DFR_CL_INS_; do
        names=( /NAS/CFG/"$prefix"*.txt )
        if [ "${#names[@]}" -gt 0 ]; then
                printf 'There exists names matching "%s"*.txt:\n' "$prefix"
                printf '\t%s\n' "${names[@]}"
        else
                printf 'No names matches "%s"*.txt\n' "$prefix"
        fi
done

shellnullglob选项使不匹配的通配模式消失而不是保持不展开。我们使用命名数组names来保存每次迭代中任何匹配的文件名。


对于您的问题的字面解释:如果目录 中至少存在一个树文件名CV_REF_DATA_09012021.txt, DB_ONLINE_CL_09012021.txt, 则调用其他脚本。将现有名称添加到数组中。DFR_CL_INS_09012021.txt/NAS/CFG

shopt -s nullglob
unset -v names

for name in CV_REF_DATA_09012021.txt DB_ONLINE_CL_09012021.txt DFR_CL_INS_09012021.txt
do
        [ -e /NAS/CFG/"$name" ] && names+=( "$name" )
done

if [ "${#names[@]}" -eq 0 ]; then
        echo 'no files could be found' >&2
        exit 1
fi

# At least one name is in the "names" array.
# Call your other script below here.

相关内容