2014-10-03 67 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