gpt4 book ai didi

bash - 使用 Bash 从 for 循环中列出所有带有前缀的文件

转载 作者:行者123 更新时间:2023-11-29 09:48:00 25 4
gpt4 key购买 nike

这是我的 bash 脚本的一个小 [但完整] 部分,它查找并输出 mydir 中的所有文件(如果它们具有来自存储数组的前缀)。我注意到奇怪的是,如果我从脚本中取出“-maxdepth 1 -name”,这个脚本会完美运行,否则它只会给我带有数组中第一个元素前缀的文件。

如果有人向我解释一下,那将是非常有帮助的。如果我正在做一些明显愚蠢的事情,请提前道歉。我对脚本编写还比较陌生。

#!/bin/sh
DIS_ARRAY=(A B C D)
echo "Array is : "
echo ${DIS_ARRAY[*]}
for dis in $DIS_ARRAY
do
IN_FILES=`find /mydir -maxdepth 1 -name "$dis*.xml"`
for file in $IN_FILES
do
echo $file
done
done

输出:

/mydir/Abc.xml
/mydir/Ab.xml
/mydir/Ac.xml

预期输出:

/mydir/Abc.xml
/mydir/Ab.xml
/mydir/Ac.xml
/mydir/Bc.xml
/mydir/Cb.xml
/mydir/Dc.xml

最佳答案

无论哪种方式,循环都会被打破。原因

IN_FILES=`find mydir  -maxdepth 1 -name "$dis*.xml"`

有效,而

IN_FILES=`find mydir "$dis*.xml"`

不是因为在第一个中,您指定了 -name。在第二个中,find 列出了 mydir 中的所有文件。如果将第二个更改为

IN_FILES=`find mydir -name "$dis*.xml"`

您会看到循环不起作用。

如评论中所述,您当前使用的语法 $DIS_ARRAY 只会为您提供数组的第一个元素。

尝试将循环更改为:

for dis in "${DIS_ARRAY[@]}"

在您的特定情况下,扩展周围的双引号不是绝对必要的,但如果您的数组中的元素包含空格,则需要,如以下测试所示:

#!/bin/bash

arr=("a a" "b b")

echo using '$arr'
for i in $arr; do echo $i; done
echo using '${arr[@]}'
for i in ${arr[@]}; do echo $i; done
echo using '"${arr[@]}"'
for i in "${arr[@]}"; do echo $i; done

输出:

using $arr
a
a
using ${arr[@]}
a
a
b
b
using "${arr[@]}"
a a
b b

查看此 related question了解更多详情。

关于bash - 使用 Bash 从 for 循环中列出所有带有前缀的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22365552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com