2017-02-16 1 views
1

Linuxでは、のような簡単なコマンドライン条件を実行できます。2つのLinux条件を組み合わせることは可能ですか?

echo 'The short brown fox' | grep -q 'fox' && echo 'Found' || echo 'Not Found' 

>> Found 

それとも

test -e test.txt && echo 'File Exists' || echo 'File Not Found' 
>> File exists 

それが一つに二つの条件を組み合わせることが可能ですか?だからもし狐が見つかったら、ファイルが存在するかどうかを調べ、それに応じて条件を実行します。

私は次のことを試してみましたし、彼らが動作するように表示されません。

echo 'The short brown fox' | grep -q 'fox' && (test -e test.txt && echo 'File Exists' || echo 'File Not Found') || echo 'Fox Not Found' 

echo 'The short brown fox' | grep -q 'fox' && `test -e test.txt && echo 'File Exists' || echo 'File Not Found'` || echo 'Fox Not Found' 

私は、単一の行に場所を取るためにコマンドを必要としています。

答えて

2

echo 'The short brown fox' | grep -q 'fox' && 
{ [[ -e test.txt ]] && echo "file exists" || echo 'File Not Found'; } || echo 'Not Found' 

中括弧内のコマンドのすべてのgrepが成功すると||{ ...; }外のとき、すなわち{ ...; }が実行されますがgrepの障害のために評価されます。


編集:ここでは

が同じことをやってcsh 1つのライナーです:

echo 'The short brown ox' | grep -q 'fox' && ([ -e "test.txt" ] && echo "file exists" || echo 'File Not Found' ;) || echo 'Not Found' 
+0

これはエラーのようです:{:コマンドが見つかりません。 ファイルが見つかりません }:コマンドが見つかりません。 が見つかりません – difurious

+0

あなたはどのシェルを使用していますか?これは 'bash'の私にとってうまくいきました – anubhava

+0

私は-cshを使用しています – difurious

0

ええ!

:あなたはあなただけが行うことができ、「見つかった」または「見つからない」を参照してくださいようにも grepの出力を抑制したい場合

echo "The short brown fox" | grep fox && echo found || echo not found 

:あなたは、ととや、このような演算子を使用することができます

echo "The short brown fox" | grep fox >/dev/null && echo found || echo not found 

&&オペレータと||オペレータが短絡しているので、echo "The short brown fox" | grep fox >/dev/null場合は(0)、次いでecho foundが実行され、それはまた、0の終了コードを返すので、echo not foundを実行することはありませんtruthy終了コードを返します。

同様に、echo "The short brown fox" | grep fox >/dev/nullが偽の終了コード(> 0)を返した場合、echo foundはまったく実行されず、echo not foundが実行されます。

あなたは、このようなシェルのグループの複数のコマンドに { ...; }を使用することができます
2

はこのような||&&を組み合わせないでください。明示的なifステートメントを使用します。

if echo 'The short brown fox' | grep -q 'fox'; then 
    if test -e test.txt; then 
     echo "File found" 
    else 
     echo "File not found" 
    fi 
else 
    echo "Not found" 
fi 

a && b || caが成功し、(あなたがa && { b || c; }を使用することができますが、しかしif文は、より読みやすい)bが失敗した場合と同等ではありません。

+1

これは1行で実行することはできません。 – difurious

+0

もちろん可能です。 'もしあれば...。それから...エコー。 else;エコー; fi; else echo; fi'。しかし、あなたは短いコマンド、または*正しいコマンドを望んでいますか?シェル内の改行をどこでも見ることができます。セミコロンで置き換えることができます。 – chepner

+0

タグの 'csh'への変更に気づいたばかりです。この答えがまだ当てはまるかどうかは分かりませんが、 'csh'から' bash'(あるいは少なくともPOSIXに関連するもの)に切り替える理由はたくさんあります。 – chepner

関連する問題