运行 bash .sh 脚本时收到“grep:文件名:没有这样的文件或目录”。
命令正在手动运行。文件类型是“ASCII 文本,具有很长的行”。这会引起问题吗?
overall_row_count=$(grep -c "^000[1-5]" $filename)
trailer=$(awk 'substr($0,0,4)=="T999" {print}' ${filename})
overall_trailer_count=$(echo "${trailer:29:8}" | sed 's/^0*//')
if [[ ${overall_row_count} == ${overall_trailer_count} ]]
then
echo "Count matches"
else echo "Count doesn't match"
fi
p=53
for i in {0001..0005}
do
row_count=$(grep -c "^$i" $filename)
trailer_count=`echo "${trailer:$p:7}" | sed 's/^0*//'`
p=`expr $p + 7`
if [[ ${row_count} -eq ${trailer_count} ]]; then
echo "Count matches."
else
echo "Count doesn't match"
fi
done
设置-x输出
++ grep -c '^000[1-5]' BB.CD.20210502.DAT
grep: BB.CD.20210502.DAT: No such file or directory
+ overall_row_count=
++ awk 'substr($0,0,4)=="T999" {print}' BB.CD.20210502.DAT
awk: fatal: cannot open file `BB.CD.20210502.DAT' for reading (No such file or directory)
+ trailer=
++ echo ''
++ sed 's/^0*//'
+ overall_trailer_count=
+ [[ '' == '' ]]
+ echo 'Count matches'
Count matches
+ p=53
+ for i in '{0001..0005}'
++ grep -c '^0001' BB.CD.20210502.DAT
grep: BB.CD.20210502.DAT: No such file or directory
+ row_count=
++ echo '' ++ s
答案1
您的问题不太可能是文本文件中的长行。
更有可能的是,您的脚本正在更改工作目录的上下文中运行,或者以令人惊讶的方式更改 $filename 的内容。
您是否尝试过将 set -x 放入脚本中以准确查看执行时 $filename 的内容?这可能会提供一些线索。
在脚本中添加 pwd 命令也可能会给您提供线索。
如果这不能让您走上正轨,请更新您的问题以包含您从我的上述建议中获得的信息,并且可能会提供一些更有针对性的建议。
答案2
我遇到了类似的问题,grep
什么也没找到,在我的情况下,是由于我创建了一个路径变量dir="~/git/Marlin"
,在出现使用grep foo $dir/bar
错误后,为了修复它,我必须更改为dir="$HOME/git/Marlin"
并修复它。