私はbash初心者で、次の問題を解決したいと思います。ディレクトリ内の1000を超える数値を含むコマンドライン引数で受け取ったすべてのファイルを見つけます。コマンドラインに引数がない場合、メッセージが表示され終了します。
まず、grepを使用して大きいことを確認する方法がわからないので、1000のような数字があるかどうかを確認したいと思います。これは私のコードです。
#!/bin/bash
if [ $0 -eq 0 ]
then
echo "No arguments"
exit 0
fi
for filename in $1
do
if [ -f filename ]
then
if grep -q "1000" $filename
echo $filename
fi
fi
done
3行と15行でエラーが発生しますが、理由はわかりません。
誰でも私を助けることができますか?
更新されたコード:
#!/bin/bash
if [ $1 -eq 0 ]
then
echo "No arguments"
exit 0
fi
for filename in $1
do
if [ -f filename ]
then
if grep -q "1000" $filename
then
echo $filename
fi
fi
done
答え1
$0
コマンドライン引数ではなくスクリプト名に展開されます。
コマンドライン引数がないことを確認するには、次のようにします。
if (($#==0)); then
echo "No arguments" >&2
exit 1
fi
$#
コマンドライン引数の数だけ拡張されます。また、エラーをstderrにリダイレクトし、0ではなくコード1で終了することに注意してください。 0 は通常成功を示し、0 以外の場合はエラーを示します。
$1
常にオプションですので、循環する必要はありません。また、あなたのスクリプトは目次-f
パラメータとして、これは技術的にはファイルですが、テストに合格しません。
grep -q "1000" $filename
ファイルが存在するかどうかが検索され1000
、実際に1000が含まれていない場合(たとえば)、1000より大きい数字は検索されません101000
。
ディレクトリで再帰 grep を使用して正規表現検索を実行して、1000 以上の数値を見つけることができます。
grep -rE '[1-9][0-9]{3,}' "$1"
これにより、ファイル名と一致が印刷されますが、ファイル名のみを印刷するには、次の手順を実行できます。
grep -rEl '[1-9][0-9]{3,}' "$1"