2017-07-23 42 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

修正了,謝謝你的收穫。 –