shell script 在if 的判斷條件正則表達式=~中引號問題
今天在腳本里運行if判斷的時候,總是進不了對應的分支,檢查正則表達式也沒有錯誤。單獨拿到shell里面執行還是顯示沒有匹配。比較奇怪,就搜了下,才發現是在=~ 后面的正則表達式上不能加上引號,而且以點代表任意字符,最后面是不能加上(.)*來匹配接完的。
下面是搜到的部分信息:
一個匹配ip地址的測試,結果匹配不了:
newip='192.168.1.1' if [[ "$newip" =~ '^([0-9]{1,3}\.){3}[0-9]{1,3}$' ]];then echo '找到了ip地址' fi
翻遍了google中的中文資料,都沒發現問題。最后終於用英文搜到《Advanced Bash-Scripting Guide》中的一篇介紹Bash版本的文章,其中寫道:
The =~ Regular Expression match operator no longer requires quoting
of the pattern within [[ … ]].
把測試條件換成下面這樣就成功了。
if [[ "$newip" =~ ^([0-9]{1,3}.){3}[0-9]{1,3}$ ]];then # if [[ "$newip" =~ $reg ]]也可以寫成if [[ $newip =~ $reg ]] 或者[[ 2.22.29 =~ ^[0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2}$ ]] && echo 1 || echo 0 .... fi
使用變量的時候,是可以使用引號的:
newip='192.168.1.100' reg='^([0-9]{1,3}.){3}[0-9]{1,3}$' if [[ "$newip" =~ $reg ]];then echo '找到了ip地址' fi
但是,對於 $reg
這個變量,在 [[]]
操作符中,就不能加上雙引號,否則也會不匹配。