用戶互動
在《學習筆記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.
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/143444.html
標籤:Linux
