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程序。
- #!/bin/bash
- #name display program
- if [ $# -eq 0 ]; then
- echo "Name not provided."
- else
- echo "Your name is $1."
- fi
在bash中,可以像下面 這樣執行mypgm1:
- # . mypgm1
那么會得到下面的輸出:
Name not provided.
但是,如果像下面這樣執行mypgm1:
- # . 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的示范程序:
- #!/bin/bash
- #my test program
- echo "Number of parameter is $#"
- echo "Program name is $0"
- echo "Parameters as a single string is $*"
在bash中,如果從命令行上執行mypgm2,如下所示:
- # . mypgm2 David Victor
那么會得到下面的結果:
- Number of parameters is 2
- Program name is mypgm2
- Parameters as a single string is David Victor