2016-10-03 15 views
0

私は、さまざまなディレクトリの下でファイル名を収集し、特定のパターンをgrepsし、その出力を別のスクリプトに送るスクリプトを持っています。ファイルの内容を取得する際に問題が発生しました。何も取得しないか、「そのようなファイルやディレクトリのエラーはありません」。ファイル名は、それらにスペースを有することが可能であるので、私は試してみました:変数に格納されたファイル名のファイル内容を出力する

1.

$FILENAME="cat $FILENAME" 
echo $FILENAME | grep "pattern" 

2.

FILENAME=$(printf %q "$FILENAME") 
$(cat "$FILENAME") | grep "pattern" 

3.

しかし、これらの私が試したこれらのすべての組み合わせは動作していないように見えますが、私は常にgrepの前に空のファイルの内容を取得しています。誰かが何が不足しているのかを指摘できますか?

+2

あなたは 'grep"パターン "" $ FILENAME "'だけを試しましたか? –

答えて

3
$FILENAME="cat $FILENAME" 
echo $FILENAME | grep "pattern" 

「$」というプレフィックスを省略して変数を設定したため、間違っています。さらに、変数を文字列CAT $FILENAMEに設定します。代わりに:

FILENAME=$(cat $FILENAME) 
echo $FILENAME | grep "pattern" 

しかし、その後、名前の隣にあなただけで、独自の変数にファイルの内容を保存せずに行うことができ、ファイルの内容を、grepをすることになります。

grep "pattern" "$FILENAME" 

2番目の試みで

FILENAME=$(printf %q "$FILENAME") 
$(cat "$FILENAME") | grep "pattern" 

あなたが自分自身に戻って変数を格納し、何らかの理由で、あります。次に、そのファイルの内容をgrepにキャッチします。どちらも不要です(上記の解決策を参照)。リダイレクトと一緒に行ったFILECONTENT変数に内容を取得するために

代わりのcat:あなたの最後の試みで、最後に

、。どちらの方法でも、ファイルの内容を変数に格納する必要がないため、ファイル自体にすでに存在しているため、余計です。あなたの2番目のラインはお金の上にありますが、リダイレクトが最初のラインで失敗したので、それは洗濯物です。それを行います

[[ -f "$FILENAME" ]] 

:ファイル名がそもそも正しいかどう

0

それはテストの価値があるかもしれません。したがって

if [[ -f "$FILENAME" ]]; then 
    grep "$pattern" "$FILENAME" 
else 
    echo "$FILENAME does not exist" >&2 
fi 

あなたは何が起きているかをお知らせします。もちろん、grep "$pattern" "$FILENAME"のアプローチを使用すると、grepは存在しないファイルについても知らせます。どのくらいエラー状態を制御したいのかという疑問です。

関連する問題