2017-04-11 15 views
0

私はbashスクリプトを作成しようとしています。bashスクリプトで変数にMacアドレスを保存し、それを使って変更を確認する

  1. スクリプトは、IPアドレス
  2. スクリプトは、IPアドレスのある行のためarp -aコマンドをgrepするためのユーザーを要求します。
  3. MACアドレスはMACと呼ばれる変数として保存されます。
  4. スクリプトは、MACアドレスが変更されていないことを確認します。
#!/bin/bash 
# Xdetect 

echo "Welcome to Xdetect" 
echo "Enter IP address of device to monitor (usually default gateway)" 
read IP 

MAC=arp -a | grep $IP | awk {'print $4'} 
echo =$MAC 
while : 'arp -a | grep $IP | awk {'print $4'}' = $MAC 

do 
echo "Mac has not changed" 
sleep 2 
done 

スクリプトが動作しない、それがループしてMAC has not changed場合でも、MACアドレスの変更をエコーし​​ます。 Xdetect.sh 9: Xdetect.sh: -a: not found

が、私はこれをどのように修正することができます:それは、エラーをループ直前に

は言って表示されますか?

+2

あなたはa)の優れたチュートリアルを読む必要がありません。 //linuxcommand.org/tlcl.php)、b)http://www.shellcheck.net/を使用して、それが示すすべてのものを修正します。一見:変数へのコマンドの出力、パラメータ引用、awkコマンドの引用、whileループ構文... –

+0

'MAC = $(arp -a | grep $ IP | awk '{print $ 4}')' 'echo $ MAC'と' while ["$(arp -a | grep $ IP | awk '{print $ 4}')" = "$ MAC"] ' – Arash

+0

これは完璧に動作します。 –

答えて

2

whileステートメントにnullコマンド:の代わりにtestを指定しましたか?アンチパターンはgrepせずにこのような何か、| AWK::がnull-コマンドは常にtrueを返すと無視しているので、 メッセージが繰り返し印刷されている「Macは変わっていない」

あなたの観察は(のみ

MAC=$(arp -a | awk -v ip="$IP" '$2 == "("ip")" { print $4 }') 
echo "$MAC" 
while test $(arp -a | awk -v ip="$IP" '$2 == "("ip")" { print $4 }') = "$MAC"; do 
    echo "Mac has not changed" 
    sleep 2 
done 
を拡大しています)その引数。効果的にあなたのコードは、たとえば、[BashGuide](http://mywiki.wooledge.org/BashGuide)および/または[Linuxのコマンドライン](HTTPの場合、

while true; do 
    echo echo "Mac has not changed" 
    sleep 2 
done 
+1

IPが正規表現として扱われ、 '.'はワイルドカードであるため、他の数字が何であれ、' 1.2.1.4'は '132.143'とマッチします。 –

+0

@CharlesDuffy良い点、私はそれを文字列比較にしました。 – Jens

関連する問題