我有一个迭代一系列文本文件的循环(所有文件都是name.txt
形式):
for txt in *txt; do
sed -i '$ d' $txt
done
但是,只要目录中没有.txt
文件,我就会收到以下错误消息:
sed:无法读取'* txt':没有这样的文件或目录
答案 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
另见: