用戶交互 在《學習筆記04》中我們有提到位置參數,位置參數是用來向腳本傳遞參數的一種方式。還有一種方式,是read命令。 [root@c7-server ~]# read name alongdidi [root@c7-server ~]# echo $name alongdidi read命令可以 ...
用戶交互
在《學習筆記04》中我們有提到位置參數,位置參數是用來向腳本傳遞參數的一種方式。還有一種方式,是read命令。
[root@c7-server ~]# read name alongdidi [root@c7-server ~]# echo $name alongdidi
read命令可以實現從STDIN中讀取數據存入用戶指定的變數中。
可以多變數賦值。
[root@c7-server ~]# read a b tom jerry [root@c7-server ~]# echo $a $b tom jerry
當變數數量多於值數量時,多餘的變數值為空。
[root@c7-server ~]# read a b c tom jerry [root@c7-server ~]# echo $a tom [root@c7-server ~]# echo $b jerry [root@c7-server ~]# echo $c [root@c7-server ~]#
當值數量多於變數數量時,多餘的值會被全部賦值給最後一個變數。
[root@c7-server ~]# read a b tom jerry mike [root@c7-server ~]# echo $a tom [root@c7-server ~]# echo $b jerry mike
可以通過-p選項實現提醒信息,使得整個用戶交互更加人性化。
[root@c7-server ~]# read -p "Please enter your name:" name Please enter your name:alongdidi [root@c7-server ~]# echo $name alongdidi
如果用戶不輸入的話,那麼read命令就會一直保持在那裡,除非用戶輸入或者鍵入Ctrl+c中斷。可通過-t選項指定一個超時的時長(單位:秒),這樣子會使得其更加安全,類似於網站登錄憑證的超時機制。
[root@c7-server ~]# read -p "Please enter your name:" name Please enter your name:^C [root@c7-server ~]# read -t 3 -p "Please enter your name:" name Please enter your name:[root@c7-server ~]# [root@c7-server ~]#
腳本調試
我們可以使用2個選項來對腳本進行調試。
# bash -n test.sh # bash -x test.sh
其實這兩個選項在man bash中是無法找到的,因為它們不屬於bash的選項,而是屬於set。set的一些單字元選項(短選項)可以被bash使用,-n和-x就是其中的2個。
-n:類似於語法檢測。如果腳本語法沒問題的話,就不會報錯。退出狀態碼為0。
[root@c7-server ~]# cat test.sh #!/bin/bash if id zwl &> /dev/null; then echo "User zwl exists." else echo "User zwl doesn't exists." fi [root@c7-server ~]# bash -n test.sh [root@c7-server ~]# echo $? 0
如果我們將fi註釋掉,破壞了if語句的結構體。則會報錯。
[root@c7-server ~]# cat test.sh #!/bin/bash if id zwl &> /dev/null; then echo "User zwl exists." else echo "User zwl doesn't exists." #fi [root@c7-server ~]# bash -n test.sh test.sh: line 7: syntax error: unexpected end of file [root@c7-server ~]# echo $? 2
但是這個語法檢測本身能力其實挺弱的,比如我們將else修改掉。此時語法檢測並沒有報錯。
因為它將原本雙分支的if結構體理解成了單分支,並且將elsealongdidi理解為命令,並且不會去查詢該命令是否存在。
[root@c7-server ~]# cat test.sh #!/bin/bash if id zwl &> /dev/null; then echo "User zwl exists." elsealongdidi echo "User zwl doesn't exists." fi [root@c7-server ~]# bash -n test.sh [root@c7-server ~]# echo $? 0
所以這個案例中,即便語法檢測沒問題,腳本在執行的時候依然會報錯。
[root@c7-server ~]# bash test.sh User zwl exists. test.sh: line 4: elsealongdidi: command not found User zwl doesn't exists.
因此該語法檢測,只是確保腳本是否可以執行,至於執行過程中出現的任何錯誤,只要不導致腳本無法繼續執行,就沒關係。
-x:追蹤腳本的執行過程。在遇到條件結構體時可用於理解腳本執行了哪個分支。在遇到迴圈結構體時,也可以看明白迴圈了幾次等。
[root@c7-server ~]# cat test.sh #!/bin/bash if id zwl &> /dev/null; then echo "User zwl exists." else echo "User zwl doesn't exists." fi [root@c7-server ~]# bash -x test.sh + id zwl + echo 'User zwl exists.' User zwl exists.