4

我想使用 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”语句中包含的代码

“未找到”是否意味着表明正则表达式在该字符串中找不到任何内容?这是一个真正的错误信息吗?

4

1 回答 1

4

起始注释:使用来自相关评论的输入创建的答案,尤其是对最后一条评论的回复。

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

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

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

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

表示您正在使用的外壳可能是

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

鉴于 2.02 是一个非常旧的版本(Y2K 之前),所有这一切都表明您用来运行脚本的 shell 可能不是/bin/bash,而是可能是/bin/shBourne shell 脚本最常用的路径shebang( #!) 行。

请将其更改为/bin/bash或显式运行bash scripts/ssidchecker.sh,您就可以开始了。

至于为什么else总是执行该部分[[,从if. 因此该else部分被执行。

samveen@maverick:~$ /bin/whosyourdaddy
-bash: /bin/whosyourdaddy: No such file or directory
samveen@maverick:~$ echo $?
127

作为可移植性的旁注,bash 黑客 wiki 还对[[关键字进行了以下说明:

在确实具有 的主要“POSIX-shell 超集语言”(缺少更好的术语)中[[,测试表达式复合命令是最便携的非 POSIX 功能之一。除了 =~ 运算符之外,几乎每个主要功能在 Ksh88、Ksh93、mksh、Zsh 和 Bash 之间都是一致的。Ksh93 还添加了大量其他 shell 不支持的独特模式匹配功能,包括对几种不同的正则表达式方言的支持,这些方言使用与 Bash 不同的语法调用=~,尽管=~ksh 仍然支持并且默认为 ERE。

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

于 2012-05-09T05:58:21.653 回答