Problem
Próbowałem wyodrębnić poziom sygnału dla Wi-Fi w następujący sposób, w skrypcie bash (cytaty wydają się nie mieć znaczenia):
string="$(iwconfig wlan0 | grep -I Signal)"
Jeśli echo $string
otrzymam to, czego oczekuję:
Link Quality=63/70 Signal level=-47dBm
Ale jeśli spróbuję uzyskać podłańcuch, echo ${string:5}
zwraca to samo.
Debugowanie:
Jeśli wkleję dane wyjściowe wconfig wlan0 | grep -I Signal
bezpośrednio do zmiennej: string="Link Quality=63/70 Signal level=-47dBm"
wtedy wszystko działa zgodnie z oczekiwaniami.
echo $string
# Link Quality=63/70 Signal level=-47dBm
echo ${string:5}
# Quality=63/70 Signal level=-47dBm
Pytanie: Według Internetu wszystkie zmienne bash są przechowywane jako ciągi znaków. Dlatego wynik debugowania powinien być taki sam jak mój pierwotny problem. Czy istnieje jakiś powód, dla którego nie jest on analizowany jako tekst w pierwotnym problemie?
źródło
Działa to na moim komputerze:
wlp60s0
zwlan0
.42
adBm
. Jako takiecut
polecenie otrzymuje polecenie wydrukowania pól # 4 i # 5. W twoim pytaniu nie ma miejsca, więc nie jestem pewien, jakiej wersji używasz.Możesz również użyć:
cut
zaleca się stosowanie=
jako ogranicznika pola.Jeśli chcesz użyć
${string...}
poprawnej składni to:Każda metoda będzie działać, aby pobrać podciąg po ostatniej
=
. Oryginalna metoda5
twojego pytania nie rozumiem, jak to może działać.źródło