4

我正在尝试将 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 测试(参见图片,但它在我的脚本中不起作用

在此处输入链接描述

4

3 回答 3

4

你有 bash 问题,而不是正则表达式问题。

在 bash 中分配变量时:=请不要有空格。然后,如果您想在正则表达式中保留反斜杠和空格,请在其周围使用单引号,否则 bash 会在早餐时吃掉它们。你不需要引用很酷。并iffi.

regex='^(-l)?(\s-s\s[0-9]+)?(\s[a-zA-Z0-9]+){1,2}$ <br>'
if [[ $@ =~ $regex ]]; then echo cool; fi

或者使用更简单的条件形式:

[[ $@ =~ $regex ]] && echo cool
于 2013-09-13T06:43:38.280 回答
3

某些版本的 bash 无法捕捉\s我们在其他语言/风格中习惯的方式。它没有捕捉到的一个版本\s是在我的 MacBook Air 上,带有GNU bash, version 3.2.48(1)-release-(x86_64-apple-darwin12).

=为变量赋值时,周围不应有空格。

正如Ken-YN在您帖子的评论中所说,您的模式也有一些问题,我在下面的代码中修复了它。

如果\s有问题,应该这样做:

#!/bin/bash
re='^(-l\ )?(-s\ [0-9]+\ )?([a-zA-Z0-9]+)(\ [a-zA-Z0-9]+)?$'
if [[ $@ =~ $re ]]; then
    echo 'cool'
fi

没有必要像我一样逃避空格,但我发现这样更容易阅读。

于 2013-09-13T06:59:07.903 回答
0

As per your input, this will match

if [[ $@ =~ -l\ -s\ [0-9]+\ [a-zA-Z]+ ]]
then 
      echo 'cool'
else
      echo 'check again' 
fi
于 2013-09-13T06:49:39.530 回答