Değişken dize olarak ayrıştırılmaz


10

Sorun

Bir bash betiğinde (tırnaklar hiçbir fark yaratmıyor gibi görünüyor) aşağıdaki şekilde wifi için sinyal seviyesini ayıklamaya çalıştım:

string="$(iwconfig wlan0 | grep -I Signal)"

Ben echo $string, beklediğim şeyi alırsam:

Link Quality=63/70 Signal level=-47dBm

Ama bir alt dize almaya çalışırsam echo ${string:5}, aynı şeyi döndürür.


debuging:

Çıktısını wconfig wlan0 | grep -I Signaldoğrudan değişkene yapıştırırsam : string="Link Quality=63/70 Signal level=-47dBm"o zaman her şey beklendiği gibi çalışır.

echo $string 
# Link Quality=63/70 Signal level=-47dBm
echo ${string:5}
# Quality=63/70 Signal level=-47dBm

Soru: İnternete göre tüm bash değişkenleri karakter dizgileri olarak saklanır. Bu nedenle, hata ayıklama sonucu orijinal sorunumla aynı olmalıdır. Orijinal problemde metin olarak ayrıştırılmamasının bir nedeni var mı?

Yanıtlar:


15

Bunun nedeni echo $stringbasitçe değerini yazdırmıyor string; ilk önce bir split + glob işlemi gerçekleştirir - sonuçlarından biri, önde gelen boşlukların elifte edilmesidir:

$ string=$(iwconfig wls1 | grep Signal)
$ echo $string
Link Quality=38/70 Signal level=-72 dBm

buna karşılık

$ echo "$string"
          Link Quality=38/70  Signal level=-72 dBm  

Başlangıcında bir dizi boşluk karakteri olduğunu görebiliriz $string- aslında 5'ten fazla var, bu nedenle 5'in kaldırılması, önde olmayan boşluk içeren bir dizgi bırakıyor ${string:5};

$ echo "${string:5}"
     Link Quality=38/70  Signal level=-72 dBm  
$ echo ${string:5}
Link Quality=38/70 Signal level=-72 dBm

Ek tartışma için bakınız:


4
Tl; dr her zaman değişkenlerinizi teklif eder
gronostaj

6

Bu benim makinemde çalışır:

$ string="$(iwconfig wlp60s0 | grep -I Signal)"
$ echo $string
Link Quality=68/70 Signal level=-42 dBm
$ echo $string | cut -d' ' -f4,5
level=-42 dBm
  • Makinenizde için değiştirin wlp60s0ile wlan0.
  • Not Bu arasında bir boşluk vardır Ubuntu 16.04 ve Ubuntu 19.04 kullanıyor 42ve dBm. Bu durumda, cutkomutun # 4 ve # 5 alanlarını yazdırması istenir. Sorunuzda yer yok, bu yüzden hangi sürümü kullandığınızdan emin değilim.

Ayrıca şunları kullanabilirsiniz:

$ echo $string | cut -d'=' -f3
-42 dBm
  • Bu durumda alan sınırlayıcı olarak cutkullanılması söylenir =.

${string...}Doğru sözdizimi ile kullanmak istiyorsanız :

$ echo ${string##*=}
-38 dBm

$ echo "${string##*=}"
-38 dBm  

Her iki yöntem de son dizeden sonra alt dizeyi almak için çalışır =. Sorunuzdaki orijinal yöntem 5nasıl çalıştığını anlamıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.