•深入淺出Shell編程: Shell 變數
◦1 系統變數
◦2 Shell使用者變數
■2.1 基礎
■2.2 提示
■2.3 shell 中的數組
◦3 shell 環境變數
先不要管Shell的版本,來看看Shell 變數,在Shell中有三種變數:系統變數,環境變數,使用者變數。其中使用者變數在編程過程中使用最多,系統變數在對參數判斷和命令傳回值判斷會使用,環境變數主要是在程式啟動並執行時候需要設定。
1 系統變數
Shell常用的系統變數並不多,但卻十分有用,特別是在做一些參數檢測的時候。下面是Shell常用的系統變數
表示方法 描述
$n $1 表示第一個參數,$2 表示第二個參數 ...
$# 命令列參數的個數
$0 當前程式的名稱
$? 前一個命令或函數的返回碼
$* 以"參數1 參數2 ... " 形式儲存所有參數
$@ 以"參數1" "參數2" ... 形式儲存所有參數
$$ 本程式的(進程ID號)PID
$! 上一個命令的PID
其中使用得比較多得是 $n $# $0 $? ,看看下面的例子:
複製代碼 代碼如下:#!/bin/sh
#This file is used to explain the shell system variable.
echo "the number of parameter is $# ";
echo "the return code of last command is $?";
echo "the script name is $0 ";
echo "the parameters are $* ";
echo "/$1 = $1 ; /$2 = $2 ";
下面是運行結果:
-bash-2.05b$ ./chapter2.1.sh winter stlchina
the number of parameter is 2
the return
code of last command is 0
the script name is ./chapter2.1.sh
the parameters are winter stlchina
$1 = winter ; $2 = stlchina
這個例子太簡單了,一點也不實用,下面來個實用的,如果你看不懂,沒有關係,後面的內容會有詳細解釋。 複製代碼 代碼如下:#!/bin/sh
if [ $# -ne 2 ] ; then
echo "Usage: $0 string file";
exit 1;
fi
grep $1 $2 ;
if [ $? -ne 0 ] ; then
echo "Not Found \"$1\" in $2";
exit 1;
fi
echo "Found \"$1\" in $2";
上面的例子中使用了$0 $1 $2 $# $? 等變數,下面是程式的解釋:
1.判斷運行參數個數,如果不等於2,顯示使用"用法協助", 其中 $0 表示就是指令碼自己。
2.用grep 在$2 檔案中尋找$1 字串。
3.判斷前一個命令運行後的傳回值(一般成功都會返回0, 失敗都會返回非0)。
4.如果沒有成功顯示沒找到相關資訊,否則顯示找到了。
5.其中/"表示轉義,在"" 裡面還需要顯示"號,則需要加上轉義符/" .
下面啟動並執行例子:
./chapter2.2.sh usage chapter2.2.sh
Not Found "usage" in
chapter2.2.sh
-bash-2.05b$ ./chapter2.2.sh Usage chapter2.2.sh
echo
"Usage: $0 string file";
Found "Usage" in
chapter2.2.sh
2 Shell使用者變數
2.1 基礎
不管系統變數有多少,對於需求來說,總是不夠的。使用者變數是最常用到的變數,使用也十分簡單。
使用者定義的變數必須由字母數字及底線組成,並且變數名的第一個字元不能為數字, 與其它UNIX名字一樣,變數名是大小寫敏感的. 對於使用者變數,使用者可按如下方式賦值:
name="Winter"
在引用變數時,需在前面加$符號,使用者也可以在變數間進行相互賦值,如:
name="Winter"
WINTER=$name
echo
"Hello $WINTER !"
輸出結果應該很清楚:Hello Winter !
這裡需要注意一點:變數和'='之間不要有空格,'='和賦值也不要有空格,否則shell不會認為變數被定義。掌握了基本的使用方法,你可以完全開始你的編程工作了。不過有時候需要未雨綢繆,下面介紹使用者變數的一些技巧。
2.2 提示
也可以用變數和其他字元組成新的字,這時可能需要把變數用{}括起,如:
SAT=Satur
echo
Today is ${SAT}day
輸出結果是: Today is Saturday
有時候為了避免變數名和別的字元產生混淆,你最好養成習慣把變數名用{}括起來。
對於未賦值的變數, Shell以空值對待, 使用者也可以用unset命令清除給變數賦的值.看一個例子:
複製代碼 代碼如下:#!/bin/sh
echo "a=$a" ;
a=2
echo "a=$a" ;
unset a
echo "a=$a" ;
先猜猜結果是什嗎?
-bash-2.05b$ ./test
.sh
a=
a=2
a=
如果你懂C++,你應該知道有個變數修飾符"const",用於避免程式一不小心對變數進行修改。在shell中,對於使用者變數,你可以使用同樣的修飾符"readonly", 如果我把上面的例子修改成這樣: 複製代碼 代碼如下:#!/bin/sh
echo "a=$a" ;
#下面增加了readonly
readonly a=2
echo "a=$a" ;
unset a
echo "a=$a" ;
其結果當然會不一樣了:
-bash-2.05b$ ./test
.sh
a=
a=2
a=2
2.3 shell 中的數組
shell變數中還能設定數組,但是不同的shell版本有不同數組賦值方法,而bourne shell 中不支援數組方式。因此,如果不是十分需要,還是建議你不要使用數組。若你的資料結構十分複雜,必須要使用數組,那麼我建議你還是選擇別的語言吧,shell不是萬能的。
shell有兩種賦值方式,第一種是直接用下標賦值:
name[0]="Tom"
name[1]="Tomy"
name[2]="John"
...
另一種方式對於不同的shell版本不一樣。bash中賦值:
[code]
#!/usr/local/bin/bash
name=("Tom" "Tomy" "John")
for i in 0 1 2
do echo $i:${name[$i]} ;
done
[html]
上面兩種賦值方式達到的效果一樣。另外,你看見訪問數組元素的方法了嗎?使用${name[index]}的方式。注意第一行使用的是#!/usr/local/bin/bash, 和以前有些不一樣哦。其輸出結果是:
-bash-2.05b$ ./test
.sh
0:Tom
1:Tomy
2:John
3 shell 環境變數
shell 環境變數是所有shell 程式都會接受的參數。shell程式運行時,都會接收一組變數,這組變數就是環境變數。常用的環境變數:
名稱 |
描述 |
PATH |
命令搜尋路徑,以冒號為分隔字元.注意與DOS下不同的是, 目前的目錄不在系統路徑裡 |
HOME |
使用者home目錄的路徑名,是cd命令的預設參數 |
COLUMNS |
定義了命令編輯模式下可使用命令列的長度 |
EDITOR |
預設的行編輯器 |
VISUAL |
預設的視覺編輯器 |
FCEDIT |
命令fc使用的編輯器 |
HISTFILE |
命令曆史檔案 |
HISTSIZE |
命令曆史檔案中最多可包含的命令條數 |
HISTFILESIZE |
命令曆史檔案中包含的最大行數 |
IFS |
定義SHELL使用的分隔字元 |
LOGNAME |
使用者登入名稱 |
MAIL |
指向一個需要SHELL監視其修改時間的檔案.當該檔案修改後, SHELL將發訊息You hava mail給使用者 |
MAILCHECK |
SHELL檢查MAIL檔案的周期,單位是秒 |
MAILPATH |
功能與MAIL類似.但可以用一組檔案,以冒號分隔,每個檔案後可跟一個問號和一條發向使用者的訊息 |
SHELL |
SHELL的路徑名 |
TERM |
終端類型 |
TMOUT |
SHELL自動結束的時間,單位為秒,若設為0則禁止SHELL自動結束 |
PROMPT_COMMAND |
指定在主命令提示字元前應執行的命令 |
PS1 |
主命令提示字元 |
PS2 |
二級命令提示字元,命令執行過程中要求輸入資料時用 |
PS3 |
select的命令提示字元 |
PS4 |
調試命令提示字元 |
MANPATH |
尋找手冊頁的路徑,以冒號分隔 |
LD_LIBRARY_PATH |
尋找庫的路徑,以冒號分隔 |
這些變數,要關注的最多的就是PATH, 其重要性不要我說了吧?
如果你希望把你定義的變數讓其他所有的shell程式都能使用,也就是定義新的環境變數。你只要使用export關鍵詞就可以了。例如:
export
MY_NAME=Winter
export
PATH=/home/winter/bin:$PATH
上面的程式中,第一行輸出MY_NAME變數,第二行是在環境變數PATH中增加一個路徑/home/winter/bin 。如果你希望這些設定在你登陸unix/linux都有效,你需要把他們加入到你的shell啟動指令碼中, 如果是使用bash
~/.bash_profile
其他版本你看一眼就知道了,在你的home目錄下,以"."開頭的檔案,一般都會隱藏起來,你需要使用'ls -al'命令來顯示。