通配符不会在带有变量的 for 循环中扩展

通配符不会在带有变量的 for 循环中扩展

我正在尝试使用以下命名结构循环访问多个文件:apple_123.txt, orange_456.txt,banana_789.txt

我尝试对数字使用通配符,但通配符未扩展,输出如下所示: apple_*.txt

我尝试过引用通配符,但没有什么区别。

我的循环:

fruit=(apple, orange, banana)
for f in "${fruit[@]}"
do
        echo "mv ${f}_*.txt ${f}_*.out"
done

答案1

文件通配不在双引号(或单引号)内执行。

你可以将其更改为:

fruit=(apple orange banana)
for f in "${fruit[@]}"
do
        set -- "${f}_"*.txt
        mv "$1" "${1%.txt}.out"
done

由于文件通配不会发生在引号内,这有点棘手,并且感谢 Kusalananda 的建议,我set在这里使用内置函数对文件执行通配,并将其设置为位置参数,然后我们可以使用它来执行扩展操作打开。如果可能存在多个匹配文件,则可以使用rename实用程序或另一个嵌套循环修改此脚本以对所有文件进行操作,否则,这只会​​重命名第一个匹配项。

在您当前的版本中,如果该.out文件尚不存在或者存在多个匹配项,则此脚本将无法按您希望的方式工作。如果您只想更改扩展名但保留号码,您可以使用 shell 参数扩展来简单地删除.txt然后添加.out

此外,无需在数组声明中使用逗号,元素将由空格分隔。除非您的文件名实际上包含逗号字符。

相关内容