防止循环,循环访问与模式匹配的文件,以尝试循环文本模式



我有一个循环,它遍历一系列文本文件(所有文件的形式都是name.txt(:

for txt in *txt; do
    sed -i '$ d' $txt 
done

但是每当目录中没有.txt文件时,我都会收到以下错误消息:

sed:无法读取"*txt":没有这样的文件或目录

您可以通过两种方式解决此问题:

a( 在对文件执行任何操作之前检查文件是否存在

for txt in *txt; do
  [[ -f "$txt" ]] || continue # skip if file doesn't exist or if it isn't a regular file
  # your logic here
done

b( 使用 shell 选项shopt -s nullglob这将确保 glob 在没有匹配文件时扩展到无

shopt -s nullglob
for txt in *txt; do
  # your logic here
done

另请参阅:

  • 为什么默认情况下不设置空球

这是因为它不匹配任何文件并且离开了"txt",而不是做你期望的事情,即跳过for循环。在某些实现(例如 macOS(上,它会将字符串保留为"*txt",并在变量 txt 设置为 *txt 的情况下运行 for 循环。在尝试运行 for 循环之前,您需要先测试文件模式是否存在。请参阅检查 shell 脚本中是否存在带有通配符的文件。

最新更新