2017-07-23 40 views
1
# Checking if we dealing with 1050 or 1050 Ti 
function gpu_check() { 
    test="GPU 0: GeForce GTX 1050 (UUID: GPU-97acce0b-4304-01e9-ef9d-bc3230cae912)" 
    echo "testing $test" 
    if [[ $test =~ "\sGTX\s1050\s" ]]; then 
    echo "foud 1050" 
    else 
    echo "no 1050's here" 
    fi 
} 

我想要使用正则表达式,但所有可能的变化,我可以想像,如双\,添加*和*,使用“$测试”更多的人,让我不我在期待什么。如何使用正则表达式在bash脚本

测试GPU 0:的GeForce GTX 1050(UUID:GPU-97acce0b-4304-01e9-ef9d-bc3230cae912)

没有1050的位置

我如何使它发挥作用?

+1

'\ s'是PCRE-ism。它在BRE或ERE正则表达式语法中不可用。 –

+0

我应该使用什么insted? – kusayu

+3

@medik,错 - bash确实有正则表达式语法。并请**,请**不要提醒人们使用ABS作为参考 - 这是W3School的shell脚本,充满了不良实践和过时的内容。 –

回答

3
re='[[:space:]]GTX[[:space:]]1050[[:space:]]' 
[[ $test =~ $re ]] 

...将做的伎俩。

  • \s是PCRE语法。 =~只保证POSIX ERE语法,所以PCRE扩展不可用。 [[:space:]]是POSIX兼容的等效项。
  • 你不能引用正则表达式而不会将其写成字面值。也就是说 - 必须是=~ $re而不是=~ "$re"如果您想将re中的值视为正则表达式而不是要搜索的精确字符串。

从文档上the bash-hackers wiki引用:

使用操作=〜,左手侧的操作数上对右手侧的扩展正则表达式(ERE)匹配。

这与匹配模式一致:即使正则表达式包含正则表达式特殊字符,正则表达式的每个引用部分都是从字面上进行的。

最佳做法是将正则表达式匹配到变量中。这是为了避免在其他有效的正则表达式上发生shell解析错误。

+0

编辑错字,我会接受你的回答。 re ='bla“ – kusayu

+0

非常感谢你! – kusayu

+0

修正了,谢谢你的收获。 –