使用带有bash的正则表达式的条件语句

时间:2012-04-11 16:47:14

标签: regex bash

我想使用"条件regexp"来自bash的结构,自bash的第三版(大约2004年)以来一直存在。 它应该是这样的:

if [[ $string =~ $regexp ]]; then
#do smthg
else
#do somthg else
fi

所以这是我的代码,遵循这个结构,它的作用是检查SSID中包含的名称是否在 iw dev wlan0 link 的输出中预先发送:

if [[ $(iw dev wlan0 link) =~ $SSID+ ]]; then 
    #do sthming 
else
    echo "wrong network"

fi

由于某种原因,我无法破译,如果我将它直接运行到bash shell中,这个语句非常有效,比如

if [[ $(iw dev wlan0 link) =~ $SSID+ ]]; then echo found; else echo not found; fi

但是如果我在它所包含的脚本中运行它,它就会吐出来:

scripts/ssidchecker.sh: 22: [[: not found

22是" fi"关键词。 最奇怪的是它总会执行" else"中包含的代码。声明

未找到""意味着表明正则表达式找不到该字符串中的任何内容?这是一条真正的错误消息吗?

1 个答案:

答案 0 :(得分:4)

开始注释:使用相关评论的输入创建答案,特别是在最后评论的回复中。

首先,[[是什么?它是一个shell关键字。

samveen@maverick:~$ type [[
[[ is a shell keyword

这意味着[[是bash的内部关键字,而不是命令,因此不能与其他shell一起使用。因此,您的错误输出

scripts/ssidchecker.sh: 22: [[: not found

表示您正在使用的shell可能是

  • 不是bash
  • 早于2.02的bash版本(Bash-2.02中引入[[

鉴于2.02是一个非常老的版本(在Y2K之前),所有这些只是指出你用来运行脚本的shell可能不是/bin/bash,而是{{1}这是用于Bourne shell脚本/bin/shshebang)行的最常用路径。

请将其更改为#!或明确运行/bin/bash,您就可以了。

至于始终执行bash scripts/ssidchecker.sh部分的原因,从else的角度来看,找不到[[命令与失败(非零返回值)相同。因此执行if部分。

else

作为关于可移植性的附注,bash黑客wiki还对samveen@maverick:~$ /bin/whosyourdaddy -bash: /bin/whosyourdaddy: No such file or directory samveen@maverick:~$ echo $? 127 关键字说了以下内容:

  

主要的“POSIX-shell超集语言”(缺乏一个   更好的术语)有[[,测试表达式化合物命令是   最便携的非POSIX功能之一。 除了=〜   运营商,Ksh88几乎每个主要功能都是一致的,   Ksh93,mksh,Zsh和Bash。 Ksh93还增添了大量独特之处   其他shell不支持的模式匹配功能   支持使用的几种不同的正则表达式方言   与Bash [[不同的语法,但ksh仍支持=~   默认为ERE。

因此,即使shell支持=~,您的脚本也可能在=~上失败,以防shell不是[[但支持bash