我想使用"条件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"中包含的代码。声明
未找到""意味着表明正则表达式找不到该字符串中的任何内容?这是一条真正的错误消息吗?
答案 0 :(得分:4)
开始注释:使用相关评论的输入创建答案,特别是在最后评论的回复中。
首先,[[
是什么?它是一个shell关键字。
samveen@maverick:~$ type [[
[[ is a shell keyword
这意味着[[
是bash的内部关键字,而不是命令,因此不能与其他shell一起使用。因此,您的错误输出
scripts/ssidchecker.sh: 22: [[: not found
表示您正在使用的shell可能是
[[
)鉴于2.02是一个非常老的版本(在Y2K之前),所有这些只是指出你用来运行脚本的shell可能不是/bin/bash
,而是{{1}这是用于Bourne shell脚本/bin/sh
(shebang
)行的最常用路径。
请将其更改为#!
或明确运行/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
。