알 수 없는 문제가 있습니다.. 저는 개방형 Wi-Fi 핫스팟에 연결을 유지하는 데 도움이 되도록 OSX에서 실행되는 스크립트를 만들고 있습니다. 주변의 모든 Wi-Fi 네트워크를 muntiline 변수로 읽고 있습니다. 이러한 Wi-Fi 네트워크 이름에는 때때로 공백이 포함되어 있어 문제가 발생합니다. 공백이 포함된 이 다중 행 변수를 반복하고 각 행을 있는 그대로 새 배열 셀에 추가하고 싶습니다. 아래에 내 코드를 추가하세요. 누구든지 이 문제를 해결하도록 도와줄 수 있나요?
#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
그러면 다음과 같은 출력이 제공됩니다(TPE Free가 차단되는 것을 확인).
netarray below
TPE Free HP-Print-93-LaserJet 1102
cell 0 below
TPE
cell 1 below
Free
Airport -s는 현재 다음과 같은 출력을 제공합니다.
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)
awk on Airport 명령은 단순히 개방형 네트워크의 이름을 제거하고 별도의 줄에 배치합니다.
답변1
당신은 인용해야네트워크 배열내부에교체반지 모양.
for hit in "${netarray[@]}"
do
networks[$addloopnr]="$hit"
let addloopnr++
done
답변2
mapfile -t ssids < <(
airport -s |
sed -E '
1d
/NONE$/!d
s/^[[:blank:]]*(.+) [[:xdigit:]:]{17} (...).*/\2 \1/
' |
sort -k1,1nr |
cut -d " " -f2-
)
printf "%s\n" "${ssids[@]}"
HP-Print-93-LaserJet 1102
TPE-Free
Bash v3에 맞게 조정됨
ssids=()
while read -r line; do ssids+=("$line"); done < <(
airport -s |
sed -E '
1d
/NONE$/!d
s/^[[:blank:]]*(.+) [[:xdigit:]:]{17} (...).*/\2 \1/
' |
sort -k1,1nr |
cut -d " " -f2-
)
printf "%s\n" "${ssids[@]}"
답변3
명령 결과를 배열에 직접 저장하기만 하면 됩니다.
IFS
개행 문자로만 분할하려면 약간의 조작이 필요합니다.
줄 바꿈 은 /와 함께 -ism $'\n'
과 약간 유사할 수 있습니다 .bash
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
예를 들어 샘플 출력을 기반으로 하면
$ typeset -p netarray
declare -a netarray='([0]="HP-Print-93-LaserJet 1102" [1]="TPE-Free")'
답변4
나는 이것을 Linux에서 사용했습니다. 배열 변수에서는 따옴표를 생략합니다. 다음과 같이 IFS를 개행으로 설정할 수 있습니다.
IFS=$'\n'
netarray=`airport -s`
for hit in ${netarray[@]} ; do
networks[$addloopnr]="$hit"
let addloopnr++
done