2009-08-04 64 views
6

我正在向現有腳本添加一項功能,以允許用戶配置Linux系統的主機名。是我在強制執行規則如下:如何確保Bash字符串是字母數字,沒有下劃線?

  • 必須長
  • 不能同時啓動或用連字符
  • 只能包含字母數字字符和連字符結束2到63個字符之間;所有其它字符不允許(包括下劃線,這意味着我不能使用\ W正則表達式符號)

我已經解決了該列表中的前兩個,但我無法找出如何檢查一個bash字符串是否只包含字母,數字和連字符。我想我可以用一個正則表達式來做這件事,但我很難弄清楚(我過去的一小時在網上搜索和閱讀手冊頁)。

我可以使用sed,grep或任何其他標準工具,但不能使用Perl或Python。

回答

14

好像這應該做到這一點:

^[a-zA-Z0-9][-a-zA-Z0-9]{0,61}[a-zA-Z0-9]$ 

匹配任何一個字母數字字符,然後匹配高達61個字母數字字符(包括連字符),則匹配任何一個字母數字字符。最小字符串長度是2,最大值是63.它不適用於Unicode。如果你需要它來處理Unicode,你需要添加不同的字符類來代替a-zA-Z0-9,但是原理將是相同的。

我相信正確的grep表達將與Unicode的工作是:

^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$ 
+1

如何使用第二個表達式使用grep辦呢?我正在尋找手冊頁中的開關,但沒有成功:我回應一個應該匹配的字符串,並且沒有輸出。 – 2009-08-04 19:42:36

+0

@Montecristo:'grep -E'或'egrep' – Welbog 2009-08-04 19:51:35

+0

我試過了:echo 1asdas * _- | grep -E'^ [[:alnum:]] [ - [:alnum:]] {0,61} [[:alnum:]] $',沒有輸出(也沒有單引號),大聲笑我應該問一個問題我認爲...:P – 2009-08-04 20:07:27

1

這是你需要的最後一個:sed -e 's/[^[:alnum:]|-]//g'

2

這是一個bash腳本測試第一個參數是否含有隻有字母數字或連字符。它的「管道」 $ 1的內容到grep的:

#!/bin/bash 
if grep '^[-0-9a-zA-Z]*$' <<<$1 ; 
    then echo ok; 
    else echo ko; 
fi 
+0

爲什麼這裏的^代表消極而不是第一次出現? – Stallman 2015-11-05 13:50:57

+0

它意味着「行的開始」,所以它和'$'之間的每個字符都必須符合這個模式。 – 2015-11-05 15:02:48

0

你可以只用bash的

string="-sdfsf" 
length=${#string} 
if [ $length -lt 2 -o $length -gt 63 ] ;then 
    echo "length invalid" 
    exit 
fi 
case $string in 
    -*) echo "not ok : start with hyphen";exit ;;  
    *-) echo "not ok : end with hyphen";exit ;; 
    *[^a-zA-Z0-9-]*) echo "not ok : special character";exit;; 
esac 
相關問題