防止循环迭代匹配模式的文件以尝试循环文字模式?

时间:2017-04-11 16:50:05

标签: bash for-loop wildcard

我有一个迭代一系列文本文件的循环(所有文件都是name.txt形式):

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

但是,只要目录中没有.txt文件,我就会收到以下错误消息:

  

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

2 个答案:

答案 0 :(得分:0)

这是因为它不匹配任何文件并且离开'txt'而不是做你期望的跳过for循环。在某些实现(例如macOS)上,它将字符串保留为'* txt'并运行for循环,并将变量txt设置为* txt。在尝试运行for循环之前,您需要首先测试文件模式是否存在。请参阅Check if a file exists with wildcard in shell script

答案 1 :(得分:0)

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

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

另见: