歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

linux shell編程指南第十四章------環境和shell變量

為使s h e l l編程更有效,系統提供了一些s h e l l變量。s h e l l變量可以保存諸如路徑名、文件
名或者一個數字這樣的變量名。s h e l l將其中任何設置都看做文本字符串。
有兩種變量,本地和環境。嚴格地說可以有4種,但其余兩種是只讀的,可以認為是特殊

變量,它用於向s h e l l腳本傳遞參數。

使用e c h o命令可以顯示單個變量取值,並在變量名前加$,例如:

[root@localhost huangcd]# great_picture="die hard"
[root@localhost huangcd]# echo ${great_picture}}
die hard}
[root@localhost huangcd]# echo ${great_picture}
die hard

[root@localhost huangcd]# last_file=ok.txt
[root@localhost huangcd]# echo ${last_file}
ok.txt

使用u n s e t命令清除變量。

[root@localhost huangcd]# pc=enterprise
[root@localhost huangcd]# echo 4{pc}
4{pc}
[root@localhost huangcd]# echo ${pc}
enterprise
[root@localhost huangcd]# unset pc
[root@localhost huangcd]# echo 4{pc}
4{pc}
[root@localhost huangcd]# echo ${pc}


使用s e t命令顯示所有本地定義的s h e l l變量。

[root@localhost huangcd]# set
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu")
BASH_VERSION='3.2.25(1)-release'
COLORS=/etc/DIR_COLORS.xterm

將變量並排可以使變量結合在一起:

[root@localhost huangcd]# first="bruce"
[root@localhost huangcd]# sum=willis
[root@localhost huangcd]# echo 4{first}${sum}
4{first}willis
[root@localhost huangcd]# echo ${first}${sum}
brucewillis

有時要測試是否已設置或初始化變量。如果未設置或初始化,就可以使用另一值。此命
令格式為:
$ { v a r i a b l e : - v a l u e }
意即如果設置了變量值,則使用它,如果未設置,則取新值。例如:

[root@localhost huangcd]# color=blue
[root@localhost huangcd]# echo "the sky is ${color:-grey}"
the sky is blue
[root@localhost huangcd]# unset color
[root@localhost huangcd]# echo "the sky is ${color:-grey}"
the sky is grey

可以用變量保存系統命令參數的替換信息。下面的例子使用變量保存文件拷貝的文件名
信息。變量s o u r c e保存p a s s w d文件的路徑,d e s t保存c p命令中文件目標。

[root@localhost huangcd]# source="/etc/passwd"
[root@localhost huangcd]# dest="/tmp/passwd.bak"
[root@localhost huangcd]# cp ${source} ${dest}

如果設置變量時,不想再改變其值,可以將之設置為只讀方式。如果有人包括用戶本人
想要改變它,則返回錯誤信息。格式如下:
v a r i a b l e - n a m e = v a l u e
readonly variable-name

下面的例子中,設置變量為系統磁帶設備之一的設備路徑,將之設為只讀,任何改變其值的操作將返回錯誤信息。

[root@localhost huangcd]# tape_dev="/dev/rmt/0n"
[root@localhost huangcd]# echo ${tape_dev}
/dev/rmt/0n
[root@localhost huangcd]# readonly tape_dev
[root@localhost huangcd]# tape_dev="/dev/rmt/ln"
bash: tape_dev: readonly variable

要查看所有只讀變量,使用命令r e a d o n l y即可。

[root@localhost huangcd]# readonly
declare -ar BASH_VERSINFO='([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu")'
declare -ir EUID="0"
declare -ir PPID="4931"
declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"
declare -ir UID="0"
declare -r tape_dev="/dev/rmt/0n"

環境變量用於所有用戶進程(經常稱為子進程)。登錄進程稱為父進程。s h e l l中執行的用
戶進程均稱為子進程。不像本地變量(只用於現在的s h e l l)環境變量可用於所有子進程,這
包括編輯器、腳本和應用。
環境變量可以在命令行中設置,但用戶注銷時這些值將丟失,因此最好在. p r o f i l e文件中
定義。系統管理員可能在/ e t c / p r o f i l e文件中已經設置了一些環境變量。將之放入p r o f i l e文件意
味著每次登錄時這些值都將被初始化。
傳統上,所有環境變量均為大寫。環境變量應用於用戶進程前,必須用e x p o r t命令導出。
環境變量與本地變量設置方式相同。

V A R I A B L E - N A M E = v a l u e;export VARIABLE-NAME
在兩個命令之間是一個分號,也可以這樣寫:
V A R I A B L E - N A M E = v a l u e
Export VARIABLE-NAME

顯示環境變量與顯示本地變量一樣,例子如下:

[root@localhost huangcd]# console=tty1
[root@localhost huangcd]# export console
[root@localhost huangcd]# echo $console
tty1

使用e n v命令可以查看所有的環境變量。

[root@localhost huangcd]# env
SSH_AGENT_PID=4599
HOSTNAME=localhost.localdomain
DESKTOP_STARTUP_ID=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000

使用u n s e t命令清除環境變量:

[root@localhost huangcd]# echo $console
tty1
[root@localhost huangcd]# unset console
[root@localhost huangcd]# echo $console


Brourne shell 有一些預留的環境變量名,這些變量名不能用作其他用途。通常在
/ e t c / p r o f i l e中建立這些嵌入的環境變量,但也不完全是,這取決於用戶自己。

下面為一些常用的環境變量:

[root@localhost huangcd]# echo $HOME
/root
[root@localhost huangcd]# echo $IFS


[root@localhost huangcd]# echo $LOGNAME
root
[root@localhost huangcd]# echo $MAILPATH


[root@localhost huangcd]# echo $SHELL
/bin/bash

還有一些預留的環境變量。其他系統或命令行應用將用到它們。以下是最常用的一些,
注意這些值均未有缺省設置,必須顯示說明。

1. EDITO R
設置編輯器,最常用。
$ EDITOR=vi ;export EDITOR
2. PWD
當前目錄路徑名,用c d命令設置此選項。
3. PA G E R
保存屏幕翻頁命令,如p g、m o r e,在查看m a n文本時用到此功能。
$ PAGER='pg -f -p%;d'export PAGER
4. MANPAT H

保存系統上m a n文本的目錄。目錄間用冒號分隔。
$ MANPATH=/usr/apps/man:/usr/local;/emxapnort MANPATH
5. LPDEST或P R I N T E R
保存缺省打印機名,用於打印作業時指定打印機名。
$ LPDEST=hp3si-systems

本章開始提到有4種變量,本地、環境,還有兩種變量被認為是特殊變量,因為它們是只
讀的。這兩種變量即為位置變量和特定變量參數。先來看一看位置變量。
如果要向一個s h e l l腳本傳遞信息,可以使用位置參數完成此功能。參數相關數目傳入腳
本,此數目可以任意多,但只有前9個可以被訪問,使用s h i f t命令可以改變這個限制。本書後
面將講到s h i f t命令。參數從第一個開始,在第9個結束;每個訪問參數前要加$符號。第一個
參數為0,表示預留保存實際腳本名字。無論腳本是否有參數,此值均可用。
如果向腳本傳送Did You See Th e Full Mo o n信息,下面的表格講解了如何訪問每一個參
數。
$ 0 $ 1 $ 2 $ 3 $ 4 $ 5 $ 6 $ 7 $ 8 $ 9
腳本名字 Did Yo u S e e T h e F u l l M o o n

[root@localhost huangcd]# cat param
#!/bin/bash
#param
echo "This is the script name :$0"
echo "This is the script name :$1"
echo "This is the script name :$2"
echo "This is the script name :$3"
echo "This is the script name :$4"
[root@localhost huangcd]# ./param did you see the full moon
This is the script name :./param
This is the script name :did
This is the script name :you
This is the script name :see
This is the script name :the

[root@localhost huangcd]# cat param2
#!/bin/bash
echo "Hello world this is `basename $0` calling"
[root@localhost huangcd]# ./param2
Hello world this is param2 calling

可以在腳本中向系統命令傳遞參數。下面的例子中,在f i n d命令裡,使用$ 1參數指定查
找文件名。

[root@localhost huangcd]# cat findfile
#!/bin/bash
#find
find / -name $1 -print
[root@localhost huangcd]# sh findfile passwd
/usr/lib/news/bin/auth/passwd
/usr/share/doc/nss_ldap-253/pam.d/passwd
/usr/bin/passwd
/etc/passwd
/etc/pam.d/passwd

既然已經知道了如何訪問和使用s h e l l腳本中的參數,多知道一點相關信息也是很有用的,
有必要知道腳本運行時的一些相關控制信息,這就是特定變量的由來。共有7個特定變量,見
表1 4 - 2。


[root@localhost huangcd]# cat param
#!/bin/bash
#param
echo "This is the script name :$0"
echo "This is the script name :$1"
echo "This is the script name :$2"
echo "This is the script name :$3"
echo "This is the script name :$4"
echo "the number of param is :$#"
echo "show all arguments :$*"
[root@localhost huangcd]# sh param today is very blue
This is the script name :param
This is the script name :today
This is the script name :is
This is the script name :very
This is the script name :blue
the number of param is :4
show all arguments :today is very blue

注意,$ ?返回0。可以在任何命令或腳本中返回此變量以獲得返回信息。基於此信息,可
以在腳本中做更進一步的研究,返回0意味著成功,1為出現錯誤。
下面的例子拷貝文件到/ t m p,並使用$ ?檢查結果。

[root@localhost huangcd]# cp ok.txt /tmp
[root@localhost huangcd]# echo $?
0

現在嘗試將一個文件拷入一個不存在的目錄:

[root@localhost huangcd]# cp ok.txt /usr/local/apps/dsf
cp: 無法創建一般文件“/usr/local/apps/dsf”: 沒有那個文件或目錄
[root@localhost huangcd]# echo $?
1

Copyright © Linux教程網 All Rights Reserved