Variável multilinha com espaços, adicionando cada linha a um array

5

Eu tenho um problema que não consigo descobrir .. Eu estou fazendo um script que eu vou rodar no OSX para me ajudar a ficar conectado para abrir pontos de acesso wifi. Eu estou lendo todas as redes wi-fi em torno de uma variável muntiline. Essas redes wi-fi têm espaços às vezes em seus nomes, o que representa um problema para mim. Eu quero fazer um loop através desta variável multilinha que contém espaços e adicionar cada linha como é para uma nova célula de matriz. Adicionando meu código abaixo. Alguém que possa me ajudar a resolver isso?

#Looks for available networks
netarray=('airport -s |
awk '$NF=="NONE"{print}' | 
cut -c 1-32,51-54 | 
sort -r -n -k 1.34,1.36 | 
awk '{$NF=""; print}' | 
sed -e 's/ $//' ')

#Test text added here
echo "netarray below"
echo "$netarray"
echo "cell 0 below"
echo ${netarray[0]}
echo "cell 1 below"
echo ${netarray[1]}
echo ""
#Until here

Isso me dá esta saída (Veja que o TPE Free é cortado):

netarray below
TPE Free HP-Print-93-LaserJet 1102
cell 0 below
TPE
cell 1 below
Free

airport -s me fornece esta saída atualmente:

                        SSID BSSID             RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
                   fuck this 00:1f:1f:27:e4:ac -79  11      N  -- WEP
                       BigA2 34:08:04:c3:9a:14 -85  11      N  US WPA(PSK/AES,TKIP/TKIP) WPA2(PSK/AES,TKIP/TKIP) 
                    TPE Free 78:cd:8e:a6:ff:30 -90  10      N  T9 NONE
                     CHT3826 b0:b2:dc:c3:91:77 -82  11      Y  -- WPA2(PSK/AES/AES) 
                          KK 00:e0:4c:ac:e1:05 -84  11      N  -- WEP
                 perfectidea f8:1a:67:53:eb:da -79  9,-1    Y  -- WPA2(PSK/AES/AES) 
                   tfb_18_28 b0:c7:45:ac:18:98 -87  7,+1    Y  -- WPA2(PSK/AES,TKIP/TKIP) 
   HP-Print-93-LaserJet 1102 08:3e:8e:7c:04:93 -86  6       N  -- NONE
                   SG-OFFICE 74:d0:2b:dc:67:64 -80  6       Y  -- WPA2(PSK/AES/AES) 
                      holo15 b8:55:10:bd:3e:70 -82  5,-1    Y  -- WPA(PSK/AES/AES) WPA2(PSK/AES/AES) 
             TOTOLINK N300RA 78:44:76:dd:bb:b4 -82  5,+1    Y  -- WPA(PSK/AES/AES) WPA2(PSK/AES/AES) 
               ezstay 15F-28 78:44:76:dc:f1:a0 -85  2,+1    Y  KR WPA(PSK/AES/AES) WPA2(PSK/AES/AES) 
                      12F-32 20:10:7a:9f:d9:c1 -59  1       Y  -- WPA(PSK/AES,TKIP/TKIP) 

O comando awk on airport apenas corta os nomes das redes abertas e as coloca em fileiras separadas.

    
por Bill 26.04.2014 / 20:27

3 respostas

2
mapfile -t ssids < <(
    airport -s | 
    sed -E '
        1d
        /NONE$/!d
        s/^[[:blank:]]*(.+) [[:xdigit:]:]{17} (...).*/ /
    ' | 
    sort -k1,1nr | 
    cut -d " " -f2-
)
printf "%s\n" "${ssids[@]}"
HP-Print-93-LaserJet 1102
TPE-Free

ajuste para o bash v3

ssids=()
while read -r line; do ssids+=("$line"); done < <(
    airport -s | 
    sed -E '
        1d
        /NONE$/!d
        s/^[[:blank:]]*(.+) [[:xdigit:]:]{17} (...).*/ /
    ' | 
    sort -k1,1nr | 
    cut -d " " -f2-
)
printf "%s\n" "${ssids[@]}"
    
por 29.04.2014 / 23:06
4

Você deve citar netarray no loop for-in .

for hit in "${netarray[@]}"
do
     networks[$addloopnr]="$hit"
     let addloopnr++
done
    
por 26.04.2014 / 21:48
0

apenas armazena o resultado do comando diretamente em uma matriz

isso requer mexer com IFS para dividir apenas em novas linhas

observe que $'\n' para nova linha pode ser algo como bash -ism; ymmv com zsh

OIFS=$IFS IFS=$'\n' netarray=('airport -s |
awk '$NF=="NONE"{print}' | 
cut -c 1-32,51-54 | 
sort -r -n -k 1.34,1.36 | 
awk '{$NF=""; print}' | 
sed -e 's/ $//' ') IFS=$OIFS

por exemplo. com base na sua saída de amostra,

$ typeset -p netarray
declare -a netarray='([0]="HP-Print-93-LaserJet 1102" [1]="TPE-Free")'
    
por 29.04.2014 / 21:51