变量不解析为字符串


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变量都存储为字符串。因此,调试结果应该与我原来的问题相同。是否有某些原因在原始问题中未将其解析为文本?

Answers:


15

这是因为echo $string不能简单地打印string; 的值。它首先执行split + glob操作-其结果之一是省略了领先的空格:

$ 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您问题的原始方法我不知道它如何工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.