我在/ 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 :(得分:2)
你的正则表达式看起来很好,但问题似乎出在填充变量domain
的字符串操作中。
您需要替换:
domain=${QUERY_STRING#d*=}
通过
domain=${QUERY_STRING#?d=}
这将在domain.com
$domain
更新:你错了shebang #!/bin/sh
你需要:
#!/bin/bash
更新2 :您可以在sh
(非重击)中执行此操作以获得所需的值:
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,})'
答案 1 :(得分:1)
如果您没有bash
,并且/或者您无法用#!/bin/bash
替换shebang,那么[[
表达式可能无效,或者模式替换为{{1可能行不通。
在这种情况下,您可以使用${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
中的d=
使用了更严格的模式。在这两种情况下,请小心使用QUERY_STRING
结束模式,否则$
之类的内容会通过。