在編寫腳本的過程中,很多時候都需要我們去設置IP地址,密碼之類的變量,為了易用性,我們對這些變量的值都會提供選擇范圍或者設置隨機值以及默認值等。
那么如果我們要判斷使用腳本的人有沒有輸入密碼應該怎么做呢?下面看一個常見的例子:
#設置與檢測數據庫root密碼配置
root=`openssl rand -base64 8|md5sum|cut -c 1-8 `
read -p "請輸入密碼[ root ],默認[ ${root} ]:" root_pass
然后我們運行這段:
運行結果
此時會出現兩個情況:
- 用戶輸入了自定義的密碼
- 用戶沒有輸入任何信息
首先我們對腳本進行完善一下:
#設置與檢測數據庫root密碼配置
root=`openssl rand -base64 8|md5sum|cut -c 1-8 `
echo -e "請輸入密碼[ root ],默認[ ${root} ]:n"
read root_pass
echo -e "當前設置的密碼: [ $root_pass ]"
繼續運行
執行結果
此時可以看到,如果直接回車會出現一個空白的現象,而只有用戶輸入的情況下才能出現密碼,看到這有人會說:你都沒設置,有密碼才怪。的確,我還沒設置,下面設置一下:
#設置與檢測數據庫root密碼配置
root=`openssl rand -base64 8|md5sum|cut -c 1-8 `
echo -e "請輸入密碼[ root ],默認[ ${root} ]:n"
read root_pass
if [[ -z "$root_pass" ]];then
root_pass=$root
fi
echo -e "當前設置的密碼: [ $root_pass ]"
然后執行:
出現了默認(隨機)密碼
然后到這里就解決了,看到這可能又有人迷惑了?就這?
別急,繼續往下看。
上面這個情況是只設置一個變量,但是如果需要設置好多呢?應該怎么辦?一個設置加一個判斷?
NONONO,這樣太麻煩了,下面介紹一個比較簡單的方法:定義函數
函數內容如下:
input_check(){
#1參未需要設置的變量值[提供默認變量]
#2參為這個參數的備注信息[例如:數據庫的root密碼]
#3參為一個隨機/默認值
#4參為這個變量名
if [[ -z "$1" ]];then
echo -e "${red_zt}檢測到${2}沒有輸入,已使用默認值[ ${3} ]${end}"
eval `echo "$4=$3"`
else
eval `echo "$4=$1"`
fi
}
如何使用呢?我們把上面的案例放進去:
input_check(){
#1參未需要設置的變量值[提供默認變量]
#2參為這個參數的備注信息[例如:數據庫的root密碼]
#3參為一個隨機/默認值
#4參為這個變量名
if [[ -z "$1" ]];then
echo -e "${red_zt}檢測到${2}沒有輸入,已使用默認值[ ${3} ]${end}"
eval `echo "$4=$3"`
else
eval `echo "$4=$1"`
fi
}
input(){
echo -e "$1"
read $2
}
root=`openssl rand -base64 8|md5sum|cut -c 1-8 `
input "請輸入密碼[ root ],默認[ ${root} ]:" root_pass
input_check "$root_pass" "數據庫[root]密碼" "$root" "root_pass"
然后執行:
通過函數判斷并設置變量值
有了這個函數之后,我們每次需要判斷一個值只需要按照傳參要求去調用即可實現默認值和自定義值的配置,例如:
#設置與檢測數據庫root密碼配置
root=`openssl rand -base64 8|md5sum|cut -c 1-8 `
input "請輸入密碼[ root ],默認[ ${root} ]:" root_pass
input_check "$root_pass" "數據庫[root]密碼" "$root" "root_pass"
#數據庫初始權限配置
input "是否關閉[ root ]用戶遠程登錄[ y/n ],默認[ y ]" dislogin
input_check "$dislogin" "數據庫[ root ]用戶登錄權限" "y" "dislogin"
#是否刪除測試數據庫
input "是否刪除[ test ]數據庫[ y/n ],默認[ y ]" rm_db
input_check "$rm_db" "刪除[ test ]數據庫確認" "y" "rm_db"
#結果匯總
red_z_green_z "數據庫[ root ]用戶密碼:" "[ $root_pass ]"
red_z_green_z "允許[ root ]遠程登錄:" "[ $dislogin ]"
red_z_green_z "是否刪除[ test ]數據庫:" "[ $rm_db ]"
input "是否繼續[回車繼續]" Y
是不是打開了新大陸呢?其實還可以繼續改進這個函數,想了解更多的話關注我等待更新吧。
如果這篇文章能夠幫助到你的話請給個支持,來個三連吧;
如果你還有更好的解決方法可以在評論區展現你的強大技術能力,讓大家一起學習。
關注我,帶你進入Shell腳本的世界,點擊下方“了解更多”即可看到我的腳本庫(有很多不錯的函數)。