awk 返回时转义 & 符号

escaping ampersand when returned by awk

我正在使用 echo $(/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | grep "SSID:" | grep -v "BSSID" | awk '{=""; print [=10=]}' 获取 zsh 提示符的 wifi 名称。

它适用于标准名称,但如果名称有任何非标准字符,即 'B&Q_Public' 它只会 returns B 然后说

(eval):1: command not found: Q

有什么建议

首先,airport 实用程序的长路径非常笨重。让我们做一个符号链接。

sudo ln -s /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport /usr/bin/airport

假设这样的程序输出(基于一些谷歌搜索,我以 this 为例):

     agrCtlRSSI: -76
     agrExtRSSI: 0
    agrCtlNoise: -92
    agrExtNoise: 0
          state: running
        op mode: station
     lastTxRate: 24
        maxRate: 54
lastAssocStatus: 0
    802.11 auth: open
      link auth: wpa2-psk
          BSSID: c0:3e:f:2f:c3:ad
           SSID: B&Q_Public
            MCS: -1
        channel: 4

和仅 B&Q_Public(SSID)的预期结果,使用单个 awk 命令就足够了:

airport -I | awk -F ": " '/ SSID:/{print }'

备注:

  • 字段分隔符设置为 ': ',值将始终为 </code>。</li> <li>在<code>SSID:之前有space,这样可以防止与BSSID:匹配的行。
  • 这里不用运行grep两遍,awk撑起来就好了

这里的任何地方都没有 eval 成为 运行,所以我认为仅此行不会产生您显示的错误。