2014-05-17 161 views
1

我在/ www/cgi-bin/test上有一個shell腳本,我可以在我的網絡上訪問http://192.168.1.1/cgi-bin/test域名正則表達式不匹配

我試圖解析查詢字符串,它應該像d=domain.com,並驗證對正則表達式:

#!/bin/sh 

echo "Content-type: text/html" 
echo "" 

domain=${QUERY_STRING#d=} 

if [[ ! $domain =~ [A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*(\.[A-Za-z]{2,}) ]]; then 
    exit 
fi 

echo "Validation success!" 

當這個沒有工作,我嘗試使用另一個正則表達式這是我從偷here

if [[ ! $domain =~ \ 
    ^(([a-zA-Z](-?[a-zA-Z0-9])*)\.)*[a-zA-Z](-?[a-zA-Z0-9])+\.[a-zA-Z]{2,}$ \ 
]]; then 
    exit 
fi 

我不能得到這個正則表達式匹配。在這兩種情況下,我都試圖根據Advanced Bash-Scripting Guide轉義大括號(\{2,\}),但這沒有什麼區別。

如果相關,我所在的平臺是OpenWrt 12.09。

編輯:我剛剛意識到我的shell腳本可能不支持bash的[[ ... =~ ... ]]語法。不幸的是,OpenWrt沒有包含bash。

+0

如果您使用case語句和glob匹配而不是那些皮塔來讀bashisms,它會更簡單和更便攜。 – technosaurus

+0

請發佈一個代碼示例。 –

回答

1

如果您沒有bash,和/或您不能用替換shebang,那麼[[表達式可能不起作用,或者${QUERY_STRING#pattern}的模式替換可能不起作用。

在這種情況下,你可以使用awk擊二鳥一石:

if ! echo $QUERY_STRING | awk '$0 !~ /^d=[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*(\.[A-Za-z]{2,})$/ {exit 1}'; then 
    exit 1 
fi 

或者,如果模式替換工作,只有正則表達式不那麼你可以使用expr代替awk

domain=${QUERY_STRING#d=} 
if ! expr $domain : '[A-Za-z0-9-]\{1,\}\(\.[A-Za-z0-9-]\{1,\}\)*\(\.[A-Za-z]\{2,\}\)$' >/dev/null; then 
    exit 1 
fi 

在兩種情況下,我使用的位更嚴格圖案在QUERY_STRINGd=。在這兩種情況下,請小心使用$結束該模式,否則像domain.com-這樣的內容會通過。

+0

現在我已經把我所有的頭髮都拉出來了,我可以確認模式替換確實可以工作,而'[[... =〜...]]'語法不會。您使用'expr'的解決方案取得了訣竅,但請避開加號。 (所以...很多... ESCAPE。)同樣感謝關於以'$'結尾的提示 - 否則'google.c'通過了。 –

+0

實際上'+'和'\ +'在我的系統上不起作用,所以我用'\ {1,\}'代替它的工作原理,我只是在一個地方忘了它,謝謝指出!無論如何,如果你有'awk',我推薦'awk'解決方案而不是'expr' – janos

2

你的正則表達式看起來不錯,但問題似乎是在你的字符串操作中填充變量domain

你需要更換:

domain=${QUERY_STRING#d*=} 

通過

domain=${QUERY_STRING#?d=} 

,這將給你:domain.com$domain

UPDATE:你有錯家當#!/bin/sh

你需要有:

#!/bin/bash 

更新2:可以在sh(非bash)的這樣做是爲了得到您想要的值:

QUERY_STRING='d=domain.com' 
domain=`echo "$QUERY_STRING" | awk -F'd=' '{print $2}'` 
echo "$domain" 
domain.com 

驗證您可以使用egrep

echo "$domain" | egrep -q '[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*(\.[A-Za-z]{2,})' 
+0

您列出了兩次完全相同的代碼。 – Amber

+0

等一下,我沒有看到任何區別。 – thefourtheye

+0

我的錯誤,錯誤的複製/粘貼。現在修復它 – anubhava