通配符停止工作

通配符停止工作

突然*停止工作,简单的程序:

#!/bin/bash

for f in *.txt
do
    echo $f
done

只是产生*.txt字符串而不是目录中的文件(或什么也不产生)。但*没有任何额外的字符就可以正常工作。怎么了?这太荒谬了,因为它昨天还有效。

Bash 版本是 4.4.12(1)-release。

答案1

您要么简单地在当前目录中没有任何具有.txt文件名后缀的文件,要么在脚本中的行末尾有一个不可见的字符,例如回车符。

如果您在 Windows 计算机上编辑脚本文本文件并将其另存为 DOS 文本文件,则回车符可能会潜入其中。

要从所有行中删除这些内容,请dos2unix在脚本文件上使用。

无论哪种情况,模式都不会扩展,因为没有任何内容与之匹配。因此,外壳保持未展开的图案。

如果您希望脚本在没有匹配的文件名时完全跳过循环,请设置nullglobshell 选项:

shopt -s nullglob

这使得将bash不匹配的模式扩展为空字符串。

相关内容