変数は文字列として解析されません


10

問題

私は、bashスクリプトで、次の方法でwifiの信号レベルを抽出しようとしました(引用符は違いがないようです)。

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

私の場合echo $string、期待どおりの結果が得られます。

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

しかし、部分文字列を取得しようとするとecho ${string:5}、同じ結果が返されます。


デバッグ:

の出力を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

質問:インターネットによると、すべてのbash変数は文字列として保存されます。したがって、デバッグ結果は元の問題と同じでした。元の問題でテキストとして解析されない理由はありますか?

回答:


15

これは、echo $stringが単にの値を出力しないためstringです。最初にsplit + glob操作を実行します-その結果の1つは、先頭の空白が省略されることです。

$ 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
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
  • あなたのマシンのために交換してくださいwlp60s0wlan0
  • なお、これは間にスペースがあるの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  

どちらの方法でも、lastの後に部分文字列を取得でき=ます。5あなたの質問の元の方法はどのように機能するのか分かりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.