bash shell 中變量的使用


簡介

  bash shell 中的變量就像腳本語言一樣,可以直接拿來使用,並不需要提前聲明。如果沒有特殊的限定,則變量的默認類型是字符串。bash shell中的變量一共分為3類:

  <1> 用戶自定義的變量

    也叫作本地變量,作用域為整個bash進程。

  <2> 環境變量

    使用export聲明或者定義的變量。作用域為當前的shell進程以及子進程,不影響父進程。並且如果把環境變量寫入對應的配置文件,則會對所有的shell生效。如/etc/profile, ~/.bashrc等。

    用戶可以使用export把變量聲明為環境變量,比如 export name="Frogjie"。

    系統也定義了一些環境變量,常見的有以下幾個:

      PATH 系統查找命令的路徑

      USER 當前登錄的用戶

      HOSTNAME 主機名

      SHELL 當前shell,一般是/bin/bash

  <3> 位置變量

    常用於函數傳參或者shell進程接收命令行參數。常使用的有以下幾種:

    $0: 腳本的名字

    $1, $2.... : 第n個參數。這里要注意的是,第10個參數應該寫成${10}, 而不是直接用$10

  <4> 特殊變量

    $? 上一個命令的狀態碼或者函數的返回值(必須為整數)。如果是0,則表明程序執行正確。如果是非0,則表明執行出錯。

    $*, $@ 都表示當前shell的所有參數。這兩個變量只有被雙引號包圍時才有區別。$*把所有參數當成一個整體。如果循環輸出,只會輸出一次。但是$@會把每個參數區分對待,循環輸出會輸出多次

    $# 所有參數的個數

    $$ 當前的進程號 

 

變量的作用域

  bash shell 中變量的作用域和一般的語言不太一樣。比如在函數體內定義的變量默認是global變量,函數體外可以被訪問到!!!

  <1> shell腳本內定義的變量是global變量,作用域從定義的地方開始,到被顯示刪除或者shell結束。比如下面的代碼,

  

  輸出這樣的結果:

  

  因為global變量的作用域是從定義處開始的,當函數fun執行時,global的name變量已經定義完成。所以在fun函數內部可以訪問到。由於name是global的,所以fun函數對其進行改變,在fun函數外部也是可以感知的到的。

  <2> 函數內部定義的變量默認也是global的,它的作用域是從函數被調用中執行變量定義的地方開始,到顯示被刪除或者shell結束為止。有點不好懂,看代碼:

  

  輸出如下結果:

  

  腳本中第一個name沒輸出的原因是,fun函數還沒有開始執行,所以global name 變量還沒有定義,所以沒有輸出。第二個fun中的name沒有輸出是因為雖然fun函數開始執行了,但是輸出name的操作在定義global name之前,所以也沒有輸出。在fun函數執行完之后,由於函數內部定義的變量也是global的,所以正確輸出了。

  這樣的作用域對於使用習慣高級語言的人來說,總是感覺怪怪的。bash shell提供了local關鍵字。對於上述的代碼,如果函數內部的變量不想讓外部訪問到,則可以這樣: local name="Frogjie"

  <3> 當局部變量和全局變量沖突時,這個和其他高級語言是一樣的,局部變量將會暫時覆蓋全局變量。出了局部變量的作用域后,程序使用的是全局變量。

 

dclare的使用

    dclare語法是這樣的:

    declare [+-][afrix]

    "+/-" 用來指定變量的屬性,“-”用來指定變量的屬性,“+”用來取消變量的屬性。但是有兩個例外,不能用+a來銷毀數組變量,不能用+r來取消變量read_only屬性。

    "-a" 指定變量為數組

    "-i" 指定變量為整數

    “-r” 指定變量只讀

    "-l" 如果設置了這個屬性,賦值給此變量的字符串中的大寫字母將會全部被轉換成小寫字母

    "-u" 如果設置了這個屬性,賦值給此變量的字符串中的小寫字母將會全部被轉換成大寫字母

    <1> 設置變量為只讀

      

    <2> 設置變量為整數

      這個有一個很有趣的特性。如果設置某個變量為整數,那么可以直接把表達式賦值給它,它會直接把表達式的值計算出來。但是根據簡單測試,只能傳遞簡單的表達式,如果里面帶有括號或者其他比較特殊的運算符就會出錯。同時不能給它賦值浮點數。如果給一個整數變量賦值一個字符串,那么結果是0

    

 

 

 

 

 

 

   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM