深入淺出Shell編程 Shell變數介紹_linux shell

來源:互聯網
上載者:User

•深入淺出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'命令來顯示。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.