2016-04-10 4 views
1

bashの中で二重grep比較を使うにはどうすればよいですか?二重grep比較をbash内で使うにはどうすればいいですか?

は、私が実行するトリングだ:

if [grep -q $HOSTNAME /etc/hosts] && [grep -q $IP /etc/hosts] 

then 

    echo $HOSTNAME and $IP is found into /etc/hosts, test passed OK. 

else 

    # code if not found 
    echo The Hostname $HOSTNAME'/'IP $IP is not found in /etc/hosts, please append it manually. 
    exit 1; 
fi 

が、取得エラーメッセージ:*too many arguments*

が間違って何ですか?

if grep -q "foo" /etc/hosts && grep -q "bar" /etc/hosts; then 
    # Both foo and bar exist within /etc/hosts. 
else 
    # Either foo or bar or both, doesn't exist in /etc/hosts. 
fi 

あなたのエラーの理由は、あなたが[コマンドを使用することができないということです。

+0

'test'コマンド(別名' [')はファイルをチェックし値を比較するためのものです。あなたの 'grep'から' [''] 'を削除してください。 – SLePort

答えて

0

これは、あなたが実行すべきものです

if grep -q $HOSTNAME /etc/hosts && grep -q $IP /etc/hosts 
then 
    echo "$HOSTNAME and $IP is found into /etc/hosts, test passed OK." 
else 
    # code if not found 
    echo "The Hostname $HOSTNAME'/'IP $IP is not found in /etc/hosts, please append it manually." 
    exit 1; 
fi 
+0

まだ、同じエラーメッセージがありません –

4

、これを試してみてください。 他のコマンドと同様に、[は、引数から分離しないように正しく指定できない引数も受け入れます。

[またはtestは、POSIXのテストコマンドです。ファイルや文字列について簡単なテストを行うことができます。 Bashでは、より強力な[[キーワードを使用することをお勧めします。 [[は、パターンマッチングを行うことができ、使用するのがより高速で安全です(さらにBash FAQ 31を読む)。

けれども、あなたは上記の私の溶液中で見ることができるように、あなたのケースはgrep終了ステータス *を求めるために[[[が、ちょうどif文を必要としません。


終了ステータス *:すべてのUnixのプロセスがその親に終了ステータスコードを返します。これは符号なしの8ビット値で、0〜255の数値です。特定の値でexitを特に呼び出さない限り、スクリプトは最後のコマンドの終了ステータス( )を返します。関数はまた、returnを使用して値を返します。

+0

ありがとう!今は作品です! –

0

構文が失敗します。if [grep -q $HOSTNAME /etc/hosts]if [ $(grep -q $HOSTNAME /etc/hosts) ]である必要があります。サブコマンドとしてbrachetsとgrepの周囲にスペースを入れてください。
ifは何かをテストする予定であり、テストの結果を期待していないので、これはまだ動作しません。私は通常if [ $(grep -c string file) -gt 0 ]を使用しますが、if [ -n "$(grep string file)" ]を使用することもできます。

あなたはホストとipを同じ行にしたいと思います。その場合は、次のようにします。

if [ -n "$(grep -E "${IP}.*${HOSTNAME}" /etc/hosts)" ]; then 
    echo "Found" 
fi 

# or (using the grep -q) 
grep -Eq "${IP}.*${HOSTNAME}" /etc/hosts 
if [ $? -eq 0 ]; then 

# or (shorter, harder to read for colleages, using the grep -q) 
grep -Eq "${IP}.*${HOSTNAME}" /etc/hosts)" && echo "Found" 

本当に2つのテストが必要な場合は、2つの独立したif文を考慮してください。

関連する問題