2014-10-03 66 views
0

我正试图在bash脚本中的字符串开头检查正确的格式。检查bash脚本中的字符串格式

期望的格式如下,其中字符串必须始终以“ABCDEFG-”(确切字母和顺序)开头,数字会有所不同,但至少需要3位数字。第三位数字后的所有内容都不在意。 字符串的预期开始:“ABCDEFG-1234”

我正在使用下面的代码片段。

[ $(echo "$str" | grep -E "ABCDEFG-[0-9][0-9][0-9]") ] && echo "yes" 

STR1 = “ABCDEFG-1234”

STR2 = “ABCDEFG-1234 - 一些文字”

当我在地方STR一切使用STR1工程确定并打印肯定。

当我在地方STR的使用STR2我得到下面的错误

[: ABCDEFG-1234: unary operator expected 

我非常新的使用bash脚本所以任何帮助,将不胜感激工作。

+0

的smalles为了让你的代码工作,只需要添加引号和'-n':'[-n“$(echo”$ str“| grep -E“ABCDEFG- [0-9] [0-9] [0-9]”)“] && echo”yes“' - 这样'grep'的输出不会被字符串分割并传递给'']'作为单独的参数,这是错误的直接原因,也就是说,当'grep'可以根据匹配是否匹配而直接发出真或假的退出状态时,这种方法是不必要的低效率和巴洛克式的,不需要对于'[]'或输出分析根本不需要任何外部工具如grep – 2014-10-03 20:27:39

+0

(...和'-n'只在某些病例中是必需的;在一般情况下,引用就足够了) – 2014-10-03 20:29:42

回答

2

如果这是bash,你根本就没有理由使用grep;该shell具有内置的正则表达式支持。

re="ABCDEFG-[0-9][0-9][0-9]" 
[[ $str =~ $re ]] && echo "yes" 

这就是说,你可能希望你的正则表达式来锚定,如果你想在开始,而不是在内容之间的匹配:

re="^ABCDEFG-[0-9][0-9][0-9]" 
[[ $str =~ $re ]] && echo "yes" 

尽管如此,这并不需要是一个ERE在所有 - 一个通配符式样的模式匹配也将是适当的:

if [[ $str = ABCDEFG-[0-9][0-9][0-9]* ]]; then echo "yes"; fi 
+0

glob方法工作的很好,谢谢! – Hoser 2014-10-03 20:40:48

0

尝试grep -E "ABCDEFG-[0-9][0-9][0-9].*"

+0

没有解决这个问题,这是因为没有将'grep'的输出引用到一个单一的标记以传递给'test'。当然,如果使用'grep -q'并运行'if echo'$ str“| grep -q -E ...; then ...',那么它就没有任何意义了;涉及'test'的全部是过于复杂gs不必要)。 – 2014-10-03 20:24:19