Bash腳本編程學習筆記05:用戶交互與腳本調試

用戶交互

在《學習筆記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.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章