Grep は bash スクリプトから「該当するファイルまたはディレクトリなし」を返し、手動で作業します。

Grep は bash スクリプトから「該当するファイルまたはディレクトリなし」を返し、手動で作業します。

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"修正する必要がありました。

関連情報