2012-04-29 6 views
6

ls | grep somethingコマンドからの空でない出力がある場合、いくつかのステートメントを実行したいif/thenステートメントを実行しようとしています。私は使用すべき構文を知らない。まあ、それは近いのですが、あなたはfiifを完了する必要がありBashシェル `if`コマンドが何かを返します` then`何かを実行します

if [[ `ls | grep log ` ]]; then echo "there are files of type log"; 
+0

http://mywiki.wooledge.org/BashFAQ/004( "ディレクトリが空であるかどうかを確認するにはどうすればよいですか?* .mpgファイルを確認するにはどうすればいいですか。どのくらいの数がありますか? ")は、手元にある直近の問題にいくらか関連しています。 –

答えて

18

:私はこれのいくつかのバリエーションを試してみました。

また、ifはコマンドを実行するだけで、コマンドが成功すると(状態コード0で終了します)、grepは少なくとも1つの一致が見つかった場合にのみ実行されます。だから、出力をチェックする必要はありません。

if ls | grep -q log; then echo "there are files of type log"; fi 

あなたは-q(「静かな」)オプションをサポートしていませんgrepの古いまたは非GNUバージョンのシステムを使っているのであれば、あなたをlsもDのように、それは指定されたファイルが見つからない場合は、あなたがすべてでgrepせずに同じことを行うことができます0以外の値を返しますので、

if ls | grep log >/dev/null; then echo "there are files of type log"; fi 

しかし:/dev/nullに出力をリダイレクトすることによって、同じ結果を達成することができます。シャーリーの答え:

if ls *log* >&/dev/null; then echo "there are files of type log"; fi 

それは少しwordierだけれどもまた、さえlsせず、唯一のシェルを使用してそれを行うことができます。

for f in *log*; do 
    # even if there are no matching files, the body of this loop will run once 
    # with $f set to the literal string "*log*", so make sure there's really 
    # a file there: 
    if [ -e "$f" ]; then 
    echo "there are files of type log" 
    break 
    fi 
done 

限り、あなたは特別のbashを使用しているとして、あなたはそれを簡略化するnullglobオプションを設定することができます幾分:

shopt -s nullglob 
for f in *log*; do 
    echo "There are files of type log" 
    break 
done 
+0

ありがとうございます。 –

1

ifビルトインシェルコマンドを実行し、コマンドの戻り値に基づいてブロックを選択します。 lsは、要求されたファイルが見つからない場合に別のステータスコードを返しますので、grepの部分は必要ありません。 [[ユーティリティは、実際には算術演算を実行するbash、IIRCの組み込みコマンドです。 Bourneシェルの構文から遠く離れていることはめったにないので、私はその部分で間違っている可能性があります。とにかく

、あなたが一緒にこのすべてを置く場合は、次のコマンドで終わる:

if ls *log* > /dev/null 2>&1 
then 
    echo "there are files of type log" 
fi 
+0

説明をありがとう、しかし私はむしろgrepを使用して設定されました。いくつかの正規表現規則をフィルタリングし、ls以外の他のコマンドの出力をフィルタリングするつもりです。私は例としてlsを使用していたので、私のフォーマットを解決すればもっと多くの同様のコマンドを書くことができます。 Cheers、〜) –

+1

@BillyMoon - 'ls'の出力をgreopするのではなく、' find'を使うことをお勧めします。'ls'を使用している場合は、' ls'の別名に驚かないようにフルパスを使います。 –

+0

@ D.Shawleyあなたはコマンドの特定のパスに依存することなくエイリアスと機能の両方をバイパスする 'command ls'を使うこともできます。 –

2

またはif; then; fiなし:

ls | grep -q log && echo 'there are files of type log' 

あるいは:

ls *log* &>/dev/null && echo 'there are files of type log' 
+0

'>&'ではなく '&>'を意味します。 –

関連する問題