ash 脚本:包含空格的变量拒绝被 grepped

ash 脚本:包含空格的变量拒绝被 grepped

我正在尝试运行列出的脚本http://talk.maemo.org/showthread.php?t=70866&page=2在其目标硬件上,即运行 BusyBox Ash 的诺基亚 Linux 手机。脚本接收 WiFi 网络的名称作为参数,并尝试将手机连接到该网络。我怀疑脚本可以正常工作,但我的 SSID,802.1x 业务,里面有空格和括号。因此,当我在命令提示符下输入

autoconnect.sh BU\ \(802.1x\)

我遇到了各种错误。首先,

LIST=`iwconfig wlan0 | awk -F":" '/ESSID/{print $2}'`
if [ $LIST = "\"$1\"" ]; then

...失败了,即使我已连接到网络。在命令提示符下使用单引号或双引号代替转义字符也无法避免该错误。

第二,

if [ -z `iwlist wlan0 scan | grep -m 1 -o \"$1\"` ]; then
    echo SSID \"$1\" not found;

显示 grep 找不到该字符串,尽管在命令提示符中直接输入相同的 grep 确实找到了“BU(802.1x)”

我如何引用1 美元在上述两种情况下,它可以与包含空格和括号的我的网络 SSID 一起使用吗?

谢谢。

答案1

的输出iwconfig将接入点的名称放在双引号中,这会导致一些奇怪的情况。脚本的作者在他的脚本中处理了这个“工件”,而不是立即将其删除。我建议在执行其他任何操作之前先删除引号。两种可能的方法是:

$ eval moo=`iwconfig wlan0 | awk -F":" '/ESSID/{print $2}' `
$ moo=`iwconfig wlan0 | awk -F":" '/ESSID/{print $2}' |tr -d \"`

第一个“逐字地”执行变量赋值语句,而另一个从输出字符串中删除双引号。

该脚本的第二个问题在于假设使用 $LIST 而不加引号是可以的(因为字符串包含双引号)。我认为这是一个错误,因为字符串仍然被评估为两个标记:

$ moo='"aaa bbb"'
$ if [ $moo = "\"aaa bbb\""];then ok;fi
ash: bbb": unknown operand

$  if [ "$moo" = "\"aaa bbb\"" ];then echo ok;fi
ok

为了解决这个问题,请用方括号括起参数,并删除第二个参数中的转义引号(因为我们从 iwconfig 输出中删除了它们):

if [ "$LIST" = "$1" ]; then ...

另外,为了将带有不规则字符(空格,括号)的字符串作为一个参数传递给脚本,只需引用它:

$ autoconnect.sh "a name (with a comment)"

关于使用 grep 匹配名称的最后一部分已经由 glenn jackman 充分回答了。

注意:以上内容已使用 BusyBox ash (1.20.2) 进行测试。

答案2

不要尝试添加文字引号。您需要if [ "$LIST" = "$1" ]; ...。两个变量都需要用引号引起来,以便测试命令恰好给出 3 个参数——这至关重要,特别是因为值包含空格。

对于第二个,同样的建议:if [ -z $(iwlist wlan0 scan | grep -m 1 -o "$1") ]; ...

上述内容的更好写法是:if iwlist wlan0 scan | grep -q "$1"; ...

相关内容