चर स्ट्रिंग के रूप में पार्स नहीं करता है


10

मुसीबत

मैंने निम्नलिखित तरीके से वाईफ़ाई के लिए सिग्नल स्तर को निकालने की कोशिश की, बैश स्क्रिप्ट में (उद्धरण से कोई फर्क नहीं पड़ता है):

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

यदि मैं echo $string, मुझे वह मिलता है जिसकी मुझे उम्मीद है:

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

लेकिन अगर मैं एक विकल्प प्राप्त करने की कोशिश करता हूं echo ${string:5}, तो यह उसी चीज को वापस करता है।


debuging:

अगर मैं wconfig wlan0 | grep -I Signalसीधे वेरिएबल के आउटपुट को पेस्ट करता हूं : string="Link Quality=63/70 Signal level=-47dBm"तो सब कुछ उम्मीद के मुताबिक काम करता है।

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

प्रश्न: इंटरनेट के अनुसार, सभी बैश वेरिएबल को कैरेक्टर स्ट्रिंग्स के रूप में संग्रहीत किया जाता है। इस प्रकार, डिबगिंग परिणाम मेरी मूल समस्या के समान होना चाहिए। क्या कोई कारण है कि इसे मूल समस्या में पाठ के रूप में नहीं रखा गया है?

जवाबों:


15

इसका कारण यह है कि echo $stringबस के मूल्य को प्रिंट नहीं करता है string; यह पहली बार एक विभाजन + ग्लोब ऑपरेशन करता है - जिसके परिणामों में से एक प्रमुख व्हाट्सएप है

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

जहाँ तक

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

हम देख सकते हैं कि व्हाट्सएप के पात्रों का एक क्रम है $string- शुरू में वास्तव में 5 से अधिक हैं, इसलिए 5 को हटाने से अभी भी अग्रणी ${string:5}व्हाट्सएप के साथ एक स्ट्रिंग निकलती है, जो कि एक unquot प्रतिस्थापित विकल्प ( ) भी है:

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

अतिरिक्त चर्चा के लिए देखें:


4
Tl; dr हमेशा अपने चर
gronostaj

6

यह मेरी मशीन पर काम करता है:

$ 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
  • अपनी मशीन के wlp60s0साथ बदलें wlan0
  • ध्यान दें कि यह Ubuntu 16.04 और Ubuntu 19.04 का उपयोग कर रहा है, जहां 42और के बीच एक जगह है dBm। जैसे कि cutकमांड को # 4 और # 5 फ़ील्ड प्रिंट करने का निर्देश दिया जाता है। आपके प्रश्न में कोई जगह नहीं है इसलिए मुझे यकीन नहीं है कि आप किस संस्करण का उपयोग कर रहे हैं।

आप यह भी उपयोग कर सकते हैं:

$ echo $string | cut -d'=' -f3
-42 dBm
  • इस मामले में क्षेत्र परिसीमन के रूप में cutउपयोग करने के लिए कहा जाता =है।

यदि आप ${string...}सही सिंटैक्स का उपयोग करना चाहते हैं , तो:

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

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

या तो विधि अंतिम के बाद सबस्ट्रिंग लेने के लिए काम करेगी =5आपके प्रश्न का मूल तरीका मुझे समझ नहीं आ रहा है कि यह कैसे काम कर सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.