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=
++エコ ''++ s
答え1
問題は、テキストファイルの長い行ではない可能性が高いです。
おそらく、作業ディレクトリを変更したり、$ filenameの内容を驚くべき方法で変更したりすると、スクリプトが実行されている可能性があります。
$filenameが実行されたときに正確に何を確認するために、スクリプトにset -xを入れてみましたか?これはいくつかの手がかりを提供することができます。
スクリプトにpwdコマンドを追加すると、ヒントを得ることもできます。
それでも正しい方向に行くことができない場合は、上記の提案から得られた情報を含めるように質問を更新し、より具体的な提案を提供することもできます。
答え2
同様の問題がありましたが、grep
何も見つかりませんでした。私の場合は、パス変数を作成したために発生し、dir="~/git/Marlin"
使用grep foo $dir/bar
エラーが発生した後に修正するには、に変更してdir="$HOME/git/Marlin"
修正する必要がありました。