ifステートメントで使用されている結果を見つける

ifステートメントで使用されている結果を見つける

if文でfindコマンドの結果をどのように使用し、それをtrueまたはfalseと比較できますか?

このような:

if [ `find . -name test.txt -size 156c`="true" ]; then echo Found; fi

完全なスクリプトは次のとおりです。

#!/bin/bash
if [ $# -ne 2 ]
then
    echo Not enough params
fi

if [ `find . -name $1 -size $2c | grep -q .` -eq 0 ]
then
    echo OK
fi  

答え1

findたぶん、単に出力をパイプに接続するだけでgrepトリックを実行できます。

if find . -name test.txt -size 156c | grep -q .; then echo Found; fi

find設定した名前とサイズの基準に一致するファイルが見つからない限り、呼び出しには出力がなく、grep .入力が空でない場合にのみ終了ステータスは0(「true」)になります。このオプションを-q使用するには、出力を印刷しないでください。ここでは終了状態のみを考慮するので、ここでは重要ではありません。


混乱の別の原因を取り除くには:@derobertがコメントで述べたように、括弧は構成構文の一部ではありません。ブール式を評価する役割を担うコマンドが次の形式でifあることがわかります。[終了コードの実際の値を返します([シェル組み込みの場合もあります)。このコマンドは、閉じ括弧があることを確認します。

$ [ 3 -gt 2 ] ; echo $?
0

$ [ 3 -lt 2 ] ; echo $?
1

$ [ 3 -lt 2 ; echo $?
bash: [: missing `]'
2

上記のコマンドでは、0は真、1は偽、2はエラーを意味します。

答え2

私がコメントで述べたように、あなたの質問は実際に

テストをfind満たしていることを確認するためにコマンドを使用して単一のファイルをテストするにはどうすればよいですか?findsize

ここで、ファイル名はスクリプトの引数として指定されます(したがって事前に不明)。コマンドを中心に回答を書いています。

if find . -name "$1" -size "$2"c | grep -q .
then
    echo OK
fi

私はdhagが推薦した引用符を自由に挿入しました。これは悪い始まりではありませんが、いくつかの問題があります。

  1. ユーザーが引数を使用してスクリプトを実行し、次test.txtのスクリプトがある場合test.txt 現在のディレクトリのサブディレクトリfindそして、それを見つけてパス名を印刷するとgrep成功します。ただし、スクリプトがtest.txt 現在ディレクトリに呼び出されたファイルを使用して操作しようとすると、そのファイルが存在しないため失敗します。サブディレクトリが見つからないように
    追加すると、この問題を解決できます。-maxdepth 1find
  2. ユーザーが引数を使用してスクリプトを実行すると、引数my_subdir/test.txtにスラッシュが含まれない可能性があるためfind失敗します-name
  3. 非常にいたずらなユーザーがいる場合、そのユーザーは"*"単に問題を引き起こすために入力している可能性があります。

find .実際にディレクトリツリーを検索したくないときに使用するのは少し愚かなようです。ファイル名がわかっている場合は、そのプロパティをテストできます。まあ、あなたが片目を閉じてこの本の行の間を読んでいるならばfind(1)、それは実際には決して言わないことに気づくでしょう。引数はディレクトリでなければなりません。これは単なるディレクトリであることを意味するだけです。言えることが分かりました

探す  ファイル名  [表現する]

問題に適用すると、次のようになります。

find "$1" -size "$2"c

完全な状態を確認するために、以下を提案します。

if [ -f "$1" ]  &&  find "$1" -size "$2"c | grep -q .
then
    echo OK
fi

指定されたファイルがまったく存在しない場合にエラーメッセージを受け取るのを防ぐためにfind (そして上記のいたずらなユーザーがスクリプトにディレクトリ名を提供するのを防ぐため)

答え3

他の場所で提供されているソリューションと似ていますgrepが、より簡単な場合があります。単にread終了するだけですfindfindread確かにそうだから)最初のゲームでは、確実な戻り値を提供します。

find . -name test.txt -size 156c | 
read -r na && echo ok || ! echo shite

...うまくいくでしょう。何でも印刷するとfind末尾の改行があるので、read単一の一致でもtrueを返しますfind。ただし、find何も印刷しないと、改行readを読む前に到着するため、エラーが返されます。EOF\n

関連情報