我正在尝试为基于 FreeBSD 的 pfSense 编写一个脚本。唯一给我带来麻烦的部分是正则表达式的条件。简化的代码是这样的:
RESPONSE='{"port":98989}'
REG='{"port":([0-9]*)}'
if [[ $RESPONSE =~ $REG ]]; then
PORT=${BASH_REMATCH[1]}
fi
启用跟踪模式后,返回的错误如下:
+ RESPONSE='{"port":98989}'
+ REG='{"port":([0-9]*)}'
+ '[[' '{"port":98989}' '=~' '{"port":([0-9]*)}' ]]
./pia-port-v2: [[: not found
我不明白为什么 [[
位于跟踪中的单引号之间,这可能就是发生“未找到”错误的原因。
更新
这可能是因为 pfSense 的 FreeBSD 不支持 bash,而这些指令仅适用于 bash。我在写完这个问题并试图找到答案后发现了这一点。
有人有 bourne shell 的替代品吗?目标是如果表达式匹配则返回端口号。
我是类 UNIX 操作系统中的脚本编码新手。
同时,我查看了 grep,但它似乎仅将正则表达式应用于文件输入。
最佳答案
您应该能够使用 expr
utility执行此操作,但请注意它使用 Posix basic regexps ,这意味着您需要反斜杠括号才能将它们捕获:
response='{"port":98989}'
reg='{"port":\([0-9]*\)}'
port=$(expr "$response" : "$reg")
expr
如果正则表达式不匹配,则返回失败,因此您可以使用 shell 条件来测试:
port=$(expr "$response" : "$reg") || { echo Failed; }
或
if ! port=$(expr "$response" : "$reg"); then
# Do something on failure
fi
关于regex - FreeBSD Bash - 无法使用正则表达式编写条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51116686/