標籤:
Shell 變數分為3部分,分別是使用者自訂變數、位置變數和預定義變數。
一. 自訂變數
那麼,什麼是變數呢?簡單的說,就是讓某一個特定字串代表不固定的內容,使用者定義的變數是最普通的Shell變數。y=3a+2b,就是把3a+2b這個值賦予y。變數名是以字母或下線符打頭的,可以從第二位開始加入數字,並且大小寫字母意義不同。如dir與Dir是不同的變數。變數名的長度不受限制。比如:expert=Bill,就是將Bill賦值給expert,後來指令碼讀取變數$expert時,會取值為Bill
注意!!!
- 在指派陳述式中,賦值號“=”的兩邊不能有空格,否則在執行時會引起錯誤,這一點就沒有python爽。如果在賦給變數的值中要含有空格、定位字元或分行符號,那麼,就應該用雙引號把這個字串括起來。例如, names="abc dd ff"
- 變數可以使用數字、大小寫字母、底線,但是不能以數字開頭。
可以將一個命令的執行結果賦值給變數。有兩種形式的命令替換:一種是使用倒引號(esc下面的案例)引用命令,其一般形式是:`命令`。和$(命令)相同
例如:將當前工作目錄的全路徑名存放到變數dir中,輸入以下命令列:
$ dir=`pwd`
另一種形式是:$(命令表)。上面的命令列也可以改寫為:
$ dir=$(pwd)
互動變數
利用read命令可以從鍵盤上讀取資料,然後賦給指定的變數。read命令的一般格式是:read [ 變數1] [ 變數2]… 例如:
read v1 v2 v3
如果需要提示使用者輸入,可以使用 -p 參數 例如
read -p "Please input the info to user" v1 v2 v3
輸入資料時,資料間以空格或定位字元作為分隔字元。如果變數個數與給定資料個數相同,則依次對應賦值;如果變數個數少於資料個數,則從左至右對應賦值,但最後一個變數被賦予剩餘的所有資料;如果變數個數多於給定資料個數,則依次對應賦值,而沒有資料與之對應的變數取空串。
自訂變數所有例子如下。
[[email protected] hadoop]# vi variable.sh #!/bin/bashexpert=Bill #給變數expert賦值echo $expert #輸出expert的值2ndexp=Neo #給變數2ndexp賦值失敗,失敗原因:變數名為數字開頭echo $2ndexpthirdexp=Adm Smith #給變數thirdexp賦值失敗,失敗原因:等號右邊有空格echo $thirdexplsdir=`ls /home` #將ls /home命令的傳回值賦值給變數lsdirecho $lsdirread -p "Please Input The favorite 3 letters : " FL1 FL2 FL3 #通過read命令 擷取互動變數 echo "The letters you input is: $FL1 $FL2 $FL3" #輸出互動變數
運行結果
[[email protected] hadoop]# ./variable.shBill./variable.sh: line 5: 2ndexp=Neo: command not foundndexp./variable.sh: line 8: Smith: command not foundhadoop hao moninca.sh zabbix zenoss digd Please Input The favorite 3 letters :a b cThe letters you input is: a b c
下面來說說兩個重要的變數,一個是位置變數,另一個則是預定義變數。
二.位置變數
執行Linux命令或Shell 指令碼時可以帶有參數。相應地,在Shell指令碼中應有變數。執行Shell程式時,用實參去替代這些變數。
在Shell指令碼中這類變數的名稱很特別,分別是0、1、2……這類變數稱作位置變數,因為它們與命令列上具體位置的實參相對應:命令名(指令碼名)對應位置變數0,第一個實參對應位置變數1,第二個實參對應位置變數2……如果位置變數是由兩個或更多個數字構成,那麼,必須把它們用一對花括弧括起來,如{10}、{11}。命令列實參與指令碼中位置變數的對應關係。
一個簡單的例子:
[[email protected] hadoop]# vi variable.sh #!/bin/bashecho "The letters you like is: $1 $2 $3" #輸出3個位置參數
運行結果
[[email protected] hadoop]# ./variable.sh Z W J #運行指令碼,並帶有3個參數 $1=Z、$2=W、$3=J
The letters you like is: Z W J
再比如:重啟網路服務命令,/etc/init.d/httpd status,status是/etc/init.d/httpd status命令的第一個位置變數的參數,同樣的位置變數$1可以使用參數 start 、stop等等,那我們來看看此指令碼是什麼樣的。
[[email protected] /]# cat /etc/init.d/httpd | grep -v ^# |grep -v ^$case "$1" in start) start ;; stop) stop ;; status) status -p ${pidfile} $httpd RETVAL=$? ;; restart) stop start ;; condrestart|try-restart) if status -p ${pidfile} $httpd >&/dev/null; then stop start fi ;; force-reload|reload) reload ;; graceful|help|configtest|fullstatus) $apachectl [email protected] RETVAL=$? ;; *) echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}" RETVAL=2esacexit $RETVAL
此處case了第一個位置變數的取值以及對應的操作。
三.預定義變數
預定義變數,顧名思義,就是預先設定好的系統變數。
$0 參考位置變數,即第0個變數,也就是當前指令碼的名稱。
$# 命令列上實際參數的個數。
$* 表示在命令列中實際給出的所有實參字串。
$? 上一條命令執行後的傳回值(也稱作 “退出碼”)。它是一個十進位數。命令執行成功時,則傳回值為0;如果執行失敗,則返回非0值。(不同的失敗有不同的傳回值)
$$ 當前進程的pid進程號。
一個簡單的例子:
[[email protected] hadoop]# vi variable.sh #!/bin/bashecho "The letters you like is: $1 $2 $3" #輸出位置變數的參數echo $0 #輸出指令碼名echo $# #輸出參數數量,正確的輸出為3echo $* #輸出所有參數 正確的輸出為 ZN CN SJecho $? #輸出上一條命令(echo $*)的傳回值(是否正確)#The last command is "print the members of the parameter"cd /hom #切換至目錄/home,此處輸入錯誤,命令不生效echo $? #上一條命令(cd /hom)執行失敗,返回非0cd /home/hao #切換至目錄/home,此處輸入正確了echo $? #上一條命令(cd /home)執行成功,返回0 echo $$ #當前進程的pid進程號。
View Code
運行結果:
運行結果:[root@Hao hadoop]# ./variable.sh ZN CN SJ #運行指令碼,並帶有3個參數 ZN、CN、SJThe letters you like is: ZN CN SJ./variable.sh3ZN CN SJ0./variable.sh: line 8: cd: /hom: No such file or directory105325
View Code
另一個例子,這裡用到了6個位置變數,有些位置變數的參數有空格,這裡給出參數空格的處理方式(還有其他方式,我沒有全部列出來,具體有什麼方式,大家自行思考)。
[[email protected] hadoop]# vi var_show.sh#!/bin/bashecho Running File is $0 #利用$0輸出檔案路徑mkdir $1 #取第一個參數 /home/sss作為mkdir的參數並建立檔案夾echo $1 is ready touch $1/file.$2.txt #取第一個和第二個參數$1、$2作為建立檔案 file.$2.txt的檔案路徑及名稱echo $1/file.$2.txt is ready ping $3 -c 1 >> $1/file.$2.txt #ping 第三個參數 1次(本例為192.168.0.1)的,並追加結果至剛才建立的檔案file.$2.txstr0=$? #賦值給命令傳回值,這裡應該返回0echo >> $1/file.$2.txt ping $3 -m 1 2>> $1/file.$2.txt # ping 第三個參數 1次(本例為192.168.0.1)但是參數錯誤(-m),並報錯資訊追加至剛才建立的檔案file.$2.txtstr1=$?echo >> $1/file.$2.txtpang $3 2>> $1/file.$2.txt # ping 第三個參數 1次(本例為192.168.0.1)但是命令錯誤(pang),並報錯資訊追加至剛才建立的檔案file.$2.txtstr2=$?echo >> $1/file.$2.txt$4 2>> $1/file.$2.txt #執行命令,命令為第四個參數(本例為service)但是參數錯誤,並報錯資訊追加至剛才建立的檔案file.$2.txtstr3=$?echo >> $1/file.$2.txt$5 >> $1/file.$2.txt #執行命令,命令為第五個參數(本例為service httpd)但是參數錯誤,並報錯資訊追加至剛才建立的檔案file.$2.txt str4=$?echo >> $1/file.$2.txt $6 >> $1/file.$2.txt #執行命令,命令為第六個參數(本例為service httpd stop並將資訊追加至剛才建立的檔案file.$2.txtstr5=$?echo >> $1/file.$2.txtecho $str0 $str1 $str2 $str3 $str4 $str5 #輸出所有命令的傳回值。echo >> $1/file.$2.txtecho Now the system will sleep $# seconds.sleep $# #利用預定於變數 $# ,取位置參數的個數,並sleep相應的秒數。echo FINISH!!!
運行命令 並加參數
[[email protected] hadoop]# ./var_show.sh /home/sss demo 192.168.0.1 service ‘service httpd‘ "service httpd stop"
指令碼 第一個參數 $2 第三個參數 $4 $5開始出現空格 $6也出現空格,需使用單引號和雙引號
查看結果:
Running File is ./var_show.sh/home/sss is ready/home/sss/file.demo.txt is ready0 2 127 1 2 0Now the system will sleep 6 seconds.FINISH!!!
View Code
vi 剛才建立的文檔
[[email protected] home]# vi sss/file.demo.txt PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=3.02 ms--- 192.168.0.1 ping statistics ---1 packets transmitted, 1 received, 0% packet loss, time 3msrtt min/avg/max/mdev = 3.026/3.026/3.026/0.000 msping: invalid option -- ‘m‘Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline] [-p pattern] [-s packetsize] [-t ttl] [-I interface or address] [-M mtu discovery hint] [-S sndbuf] [ -T timestamp option ] [ -Q tos ] [hop1 ...] destination./var_show.sh: line 15: pang: command not foundUsage: service < option > | --status-all | [ service_name [ command | --full-restart ] ]Usage: httpd {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}Stopping httpd: ^[[60G[^[[0;31mFAILED^[[0;39m]^M
View Code
從這裡看出,想要寫好Shell指令碼,熟練掌握和運用 位置變數和預定義變數是不可或缺的。
Shell 變數詳解教程之位置變數與預定義變數。