পরিবর্তনশীল স্ট্রিং হিসাবে বিশ্লেষণ করে না


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}) এছাড়াও এলিড করে:

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

অতিরিক্ত আলোচনার জন্য দেখুন:


4
টিএল। ডাঃ সর্বদা আপনার ভেরিয়েবলগুলি উদ্ধৃত করে
গ্রোনস্টাজ

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
  • মনে রাখবেন এটি উবুন্টু 16.04 এবং উবুন্টু 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আপনার প্রশ্নের মূল পদ্ধতিটি কীভাবে এটি কাজ করতে পারে তা আমি বুঝতে পারি না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.