0

接続しているネットワークに応じてメッセージを表示する bash スクリプト (個人用) があります。その一環として、現在接続されているワイヤレス ネットワークの ID を確認したいと考えています。

私がやっていることは、の出力からワイヤレス名を解析することでありiwconfig、名前、または特定のネットワークの特別なメッセージを出力したい:

SSID=`iwconfig wlan0|grep "ESSID:" | sed "s/.*ESSID:\"\(.*\)\"/\1/"` 2>/dev/null
case "$SSID" in
    StaffOnly)
        echo "Staff only network at Work" ;;
    *)
        echo "You're on a wireless network called $SSID"
esac

この 2 番目の部分 (接続しているネットワークの名前を出力する) は機能しますが、StaffOnly ネットワーク上にあるという特殊なケースは一致せず、他のネットワークに失敗します。

case私は、ステートメントのどこが間違っているのか知りたいです。また、とにかくこれを行うためのより良い方法がある場合。

4

2 に答える 2

3

コマンドのsed末尾がありません.*。そのはず:

SSID=`iwconfig wlan0|grep "ESSID:" | sed "s/.*ESSID:\"\(.*\)\".*/\1/"` 2>/dev/null
                                                              ^^ HERE!

それがなければ、行末を残していて、不一致を引き起こしている空白が含まれているようです。

いくつかの関連するメモ:

  • リダイレクトはバッククォートの中に入れる必要があります:

    SSID=`iwconfig wlan0|grep "ESSID:" | sed "s/.*ESSID:\"\(.*\)\".*/\1/" 2>/dev/null`
    
  • $()入れ子にすることができるため、一般的に逆引用符よりも優先されます。

    SSID=$(iwconfig wlan0|grep "ESSID:" | sed "s/.*ESSID:\"\(.*\)\".*/\1/" 2>/dev/null)
    
  • デバッグ出力を行うときは、常に変数の内容の前後にいくつかの区切り文字を追加して、先頭と末尾の空白が見えるようにします。

于 2012-11-12T13:44:36.317 に答える
3

必要ありませんsed。それはすべてgrep、次のように使用して実行できます。

SSID=$(iwconfig wlan0 | grep -oP '(?<=ESSID:")[^"]*')
于 2012-11-12T13:51:45.673 に答える