Linux —— Shell編程之變量賦值和引用


Linux的shell編程是一種非常成熟的編程語言,它支持各種類型的變量。有三種主要的變量類型:環境變量、內部變量和用戶變量。

  • 環境變量(environment variable)是系統環境的一部分,不必去定義它們。可以在shell程序中使用它們,某些變量(比如PATH)還能在shell中加以修改。
  • 內部變量(built-in variable)是由系統提供的。與環境變量不同,你不能修改它們。
  • 用戶變量(user variable)是你在編寫shell腳本時定義的。可以在shell程序內任意使用它們和修改它們。

shell編程和其他編程語言的主要不同之處是:在shell編程中,變量是非類型性質的。也就是說,不必指定變量是數字還是字符串。

用戶變量

Shell編程中,使用用戶變量無需事先聲明,同時變量名的命名須遵循如下規則:

1). 首個字符必須為字母(a-z,A-Z);
2). 中間不能有空格,可以使用下划線(_) ;
3). 不能使用標點符號 ;
4). 不能使用bash里的關鍵字(可用help命令查看保留關鍵字) 。

變量賦值

變量賦值的格式:

變量名=值

訪問變量值

要取用一個變量的值,只需在變量名前面加一個$ 。

( ATTENTION: Don't keep blank between the variable with the equal operator '=' )

舉例

#!/bin/bash
# 對變量賦值:
a="hello world"  #等號兩邊均不能有空格存在

# 打印變量a的值:
echo -e "A is: $a\n"

備注:

1). bash中變量賦值,等號兩邊均不能有空格存在;

使用自己喜歡的編輯器,輸入上述內容,並保存為文件test_hello.bsh,然后執行 chmod +x test_hello.bsh使其具有執行權限,最后輸入 ./test_hello或bash test_hello.bsh執行該腳本。

程序運行結果: 

A is: hello world

有時候變量名可能會和其它文字混淆,比如:

num=1
echo "this is the $numst"

上述腳本並不會輸出"this is the 1st"而是"this is the ";

這是由於shell會去搜索變量numnd的值,而實際上這個變量並未賦值。

我們可以用花括號來告訴shell把num變量跟其他部分分開:

num=1
echo "this is the ${num}st"

程序運行結果:

this is the 1st


位置參數

可以編寫一個shell腳本,當從命令行或者從其他shell腳本中調用它的時候,這個腳本接受若干參數。這些選項是通過Linux作為位置參數 (position parameter)提供給shell程序的。位置參數有由系統給出的專用名。存放在變量中的第一個參數名為1(數字1),在程序內可以使用$1來訪問; 存放在變量中的第二個參數名為2,在程序中可以使用$2來訪問,依此類推。在調用shell程序時,可以省略一個或幾個數字大的位置 參數。

例如,如果shell程序mypgm1要求兩個參數(比如名字和姓氏),那么可以只用一個參數(名字)來調用這個shell程序。但是,你不能只用第二個參數(姓氏)來調用shell程序。

  1.   
  1. #!/bin/bash  
  2. #name display program  
  3. if [ $# -eq 0 ]; then  
  4.     echo "Name not provided."  
  5. else  
  6.     echo "Your name is $1."  
  7. fi  

在bash中,可以像下面 這樣執行mypgm1:
  1. # . mypgm1  

那么會得到下面的輸出:
Name not provided.
但是,如果像下面這樣執行mypgm1:
  1. # . mypgm1 david  
那么會得到下面的輸出:
Your name is david.
shell程序mypgm1還說明了shell編程的另一個方面,即內部變量。在mypgm1中,變量$#是一個內部變量,它提供傳送給這個shell程序的位置參數的數量。

內部變量

內部變量是Linux所提供的一種特殊類型的變量,這類變量在程序中用來作出判斷。在shell程序內這類變量的值是不能修改的。

部分內部變量總結如下:

表 1.1. 常用內部變量

$0 相當於C語言main函數的argv[0]
$1$2... 這些稱為位置參數(Positional Parameter),相當於C語言main函數的argv[1]argv[2]...
$# 相當於C語言main函數的argc - 1,注意這里的#后面不表示注釋
$@ 表示參數列表"$1" "$2" ...,例如可以用在for循環中的in后面。
$? 上一條命令的Exit Status
$$ 當前Shell的進程號

為了說明這些變量的用法,這里有一個叫做mypgm2的示范程序:

  1. #!/bin/bash  
  2. #my test program  
  3. echo "Number of parameter is $#"  
  4. echo "Program name is $0"  
  5. echo "Parameters as a single string is $*"  


在bash中,如果從命令行上執行mypgm2,如下所示:

  1. # . mypgm2 David Victor  


那么會得到下面的結果:

    1. Number of parameters is 2  
    2. Program name is mypgm2  
    3. Parameters as a single string is David Victor 


免責聲明!

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



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