我正在尝试将bash脚本的参数与正则表达式匹配
mykill.bash [-l] [-s SIGNO] pattern1 pattern2
我正在使用这个表达式:
regex = ^(-l)?(\s-s\s[0-9]+)?(\s[a-zA-Z0-9]+){1,2}$ <br>
if [[ $@ =~ $regex ]]; then echo 'cool'
例如./mykill.bash -l -s 33 abc gives $@='-l -s 33 abc'
,它通过了debuggex.com测试(参见图片
但它在我的脚本中不起作用
答案 0 :(得分:4)
你有bash问题,而不是正则表达式问题。
在bash中分配变量时:请=
周围没有空格。
然后,如果你想在正则表达式中保留反斜杠和空格,请在它周围使用单引号,否则bash会在早餐时使用它们。你不需要引用酷。并使用if
关闭fi
。
regex='^(-l)?(\s-s\s[0-9]+)?(\s[a-zA-Z0-9]+){1,2}$ <br>'
if [[ $@ =~ $regex ]]; then echo cool; fi
或者使用条件的简单形式:
[[ $@ =~ $regex ]] && echo cool
答案 1 :(得分:3)
某些版本的bash不会像我们习惯的其他语言/风格那样捕获\s
。
一个版本无法捕获\s
,我的MacBook Air上有GNU bash, version 3.2.48(1)-release-(x86_64-apple-darwin12)
。
在为变量赋值时,=
周围不应有空格。
正如Ken-Y-N在您对帖子的评论中所说,您的模式也有一些问题,我在下面的代码中修复了它。
如果\s
出现问题,应该这样做:
#!/bin/bash
re='^(-l\ )?(-s\ [0-9]+\ )?([a-zA-Z0-9]+)(\ [a-zA-Z0-9]+)?$'
if [[ $@ =~ $re ]]; then
echo 'cool'
fi
没有必要像我一样逃避空间,但我发现这种方式更容易阅读。
答案 2 :(得分:0)
根据您的输入,这将匹配
if [[ $@ =~ -l\ -s\ [0-9]+\ [a-zA-Z]+ ]]
then
echo 'cool'
else
echo 'check again'
fi