突然*
停止工作,简单的程序:
#!/bin/bash
for f in *.txt
do
echo $f
done
只是产生*.txt
字符串而不是目录中的文件(或什么也不产生)。但*
没有任何额外的字符就可以正常工作。怎么了?这太荒谬了,因为它昨天还有效。
Bash 版本是 4.4.12(1)-release。
答案1
您要么简单地在当前目录中没有任何具有.txt
文件名后缀的文件,要么在脚本中的行末尾有一个不可见的字符,例如回车符。
如果您在 Windows 计算机上编辑脚本文本文件并将其另存为 DOS 文本文件,则回车符可能会潜入其中。
要从所有行中删除这些内容,请dos2unix
在脚本文件上使用。
无论哪种情况,模式都不会扩展,因为没有任何内容与之匹配。因此,外壳保持未展开的图案。
如果您希望脚本在没有匹配的文件名时完全跳过循环,请设置nullglob
shell 选项:
shopt -s nullglob
这使得将bash
不匹配的模式扩展为空字符串。