Shell 變數詳解教程之位置變數與預定義變數。

來源:互聯網
上載者:User

標籤:

  Shell 變數分為3部分,分別是使用者自訂變數、位置變數和預定義變數。

一.   自訂變數

  那麼,什麼是變數呢?簡單的說,就是讓某一個特定字串代表不固定的內容,使用者定義的變數是最普通的Shell變數。y=3a+2b,就是把3a+2b這個值賦予y。變數名是以字母或下線符打頭的,可以從第二位開始加入數字,並且大小寫字母意義不同。如dir與Dir是不同的變數。變數名的長度不受限制。比如:expert=Bill,就是將Bill賦值給expert,後來指令碼讀取變數$expert時,會取值為Bill

  注意!!!

  1. 在指派陳述式中,賦值號“=”的兩邊不能有空格,否則在執行時會引起錯誤,這一點就沒有python爽。如果在賦給變數的值中要含有空格、定位字元或分行符號,那麼,就應該用雙引號把這個字串括起來。例如, names="abc dd ff"
  2. 變數可以使用數字、大小寫字母、底線,但是不能以數字開頭。

  可以將一個命令的執行結果賦值給變數。有兩種形式的命令替換:一種是使用倒引號(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 變數詳解教程之位置變數與預定義變數。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.