- 論壇徽章:
- 1
|
為使s h e l l編程更有效,系統(tǒng)提供了一些s h e l l變量。s h e l l變量可以保存諸如路徑名、文件
名或者一個(gè)數(shù)字這樣的變量名。s h e l l將其中任何設(shè)置都看做文本字符串。
有兩種變量,本地和環(huán)境。
補(bǔ)充:這里似乎不全面,我們似乎更傾向于這種分法,應(yīng)該是用戶(hù)自定義變量,通常我們使用小寫(xiě)字符表示,和環(huán)境變量,通常用全部大寫(xiě)字符表示,比如PATH,這是我們執(zhí)行命令的搜索路徑。LIBRARY_PATH鏈接庫(kù)的路徑。還有局部變量,也就是上面說(shuō)的本地變量。只是在一定的區(qū)域范圍內(nèi)有效。
這樣子的話(huà),才好區(qū)分。
嚴(yán)格地說(shuō)可以有4種,但其余兩種是只讀的,可以認(rèn)為是特殊
變量,它用于向s h e l l腳本傳遞參數(shù)。
本章內(nèi)容有:
• shell變量。
• 環(huán)境變量。
• 變量替換。
• 導(dǎo)出變量。
• 特定變量。
• 向腳本傳遞信息。
• 在系統(tǒng)命令行下使用位置參數(shù)。
什么是shell變量?
變量可以定制用戶(hù)本身的工作環(huán)境。使用變量可以保存有用信息,使系統(tǒng)獲知用戶(hù)相關(guān)
設(shè)置。變量也用于保存暫時(shí)信息。例如:一變量為E D I TO R,系統(tǒng)中有許多編輯工具,但哪一
個(gè)適用于系統(tǒng)呢?將此編輯器名稱(chēng)賦給E D I TO R,這樣,在使用c r o n或其他需要編輯器的應(yīng)用
時(shí),這就是你將一直使用的E D I TO R取值,并將之用作缺省編輯器。
變量的命名需要遵守什么規(guī)則?
簡(jiǎn)單概括來(lái),有以下一些規(guī)則:
1、變量和變量的內(nèi)容用"="來(lái)連接
2、等號(hào)兩邊不能直接解空格字符,如果接上了空格,這時(shí)候shell會(huì)把變量當(dāng)作命令嘗試執(zhí)行,而找不到就會(huì)提示錯(cuò)誤
3、變量名稱(chēng)只能是英文字符和數(shù)字和下劃線(xiàn),同時(shí)數(shù)字不能是開(kāi)頭字符。
4、若有空格字符,可以使用雙引號(hào)或者單引號(hào)將內(nèi)容結(jié)合起來(lái)。但是要注意,雙引號(hào)內(nèi)的變量可以保持變量的特性,單引號(hào)內(nèi)的僅僅是一般字符。
5、必要時(shí)候以轉(zhuǎn)義字符"\"將其他一些特殊字符變成一般符號(hào)。
6、export可以使一個(gè)變量編程環(huán)境變量
7、可以使用unset取消變量的定義
本地變量
本地變量在用戶(hù)現(xiàn)在的s h e l l生命期的腳本中使用。例如,本地變量f i l e - n a m e取值為
l o o p . d o c,這個(gè)值只在用戶(hù)當(dāng)前s h e l l生命期有意義。如果在s h e l l中啟動(dòng)另一個(gè)進(jìn)程或退出,此
值將無(wú)效。這個(gè)方法的優(yōu)點(diǎn)就是用戶(hù)不能對(duì)其他的s h e l l或進(jìn)程設(shè)置此變量有效。
表1 4 - 1列出各種實(shí)際變量模式
使用變量時(shí),如果用花括號(hào)將之括起來(lái),可以防止s h e l l誤解變量值,盡管不必一定要這樣做,但這確實(shí)可用。
要設(shè)置一本地變量,格式為:
$ variable-name=valu或e $ { v a r i a b l e - n a m e = v a l u e }
注意,等號(hào)兩邊可以有空格。如果取值包含空格,必須用雙引號(hào)括起來(lái)。s h e l l變量可以
用大小寫(xiě)字母。
表14-1 變量設(shè)置時(shí)的不同模式
Va r i a b l e - n a m e = v a l u e 設(shè)置實(shí)際值到v a r i a b l e - n a m e
Va r i a b l e - n a m e + v a l u e 如果設(shè)置了v a r i a b l e - n a m e,則重設(shè)其值
Va r i a b l e - n a m e : ? v a l u e 如果未設(shè)置v a r i a b l e - n a m e,顯示未定義用戶(hù)錯(cuò)誤信息
Va r i a b l e - n a m e ? v a l u e 如果未設(shè)置v a r i a b l e - n a m e,顯示系統(tǒng)錯(cuò)誤信息
Va r i a b l e - n a m e : = v a l u e 如果未設(shè)置v a r i a b l e - n a m e,設(shè)置其值
Va r i a b l e - n a m e : - v a l u e 同上,但是取值并不設(shè)置到v a r i a b l e - n a m e,可以被替換
顯示變量
使用e c h o命令可以顯示單個(gè)變量取值,并在變量名前加$,例如:- $ GREAT_PICTURE="die hard"
- $ echo ${GREAT_PICTURE}
- die hard
- $ DOLLAR=99
- $ echo ${DOLLAR}
- 99
- $ LAST_FILE=ZLPSO.txt
- $ echo ${LAST_FILE}
- ZLPSO.txt
復(fù)制代碼 可以結(jié)合使用變量,下面將錯(cuò)誤信息和環(huán)境變量L O G N A M E設(shè)置到變量e r r o r- m s g。- $ ERROR_MSG=" Sorry this file does not exist user $LOGNAME"
- $ echo ${ERROR_MSG}
- Sorry this file does not exist user root
復(fù)制代碼 上面例子中,s h e l l首先顯示文本,然后查找變量$ L O G N A M E,最后擴(kuò)展變量以顯示整個(gè)
變量值。
清除變量
使用u n s e t命令清除變量。
unset variable-name- $ PC=enterprise
- $ echo ${PC}
- enterprise
- $ unset PC
- $ echo ${PC}
復(fù)制代碼 顯示所有本地shell變量- $ set
- ......
- BASH_VERSION='4.0.23(1)-release'
- COLORS=/etc/DIR_COLORS
- COLORTERM=gnome-terminal
- COLUMNS=80
- CVS_RSH=ssh
- DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-MmGXVtOFZ0,guid=604b8af6bd4ce1a0b825456b4ce79674
- DESKTOP_SESSION=gnome
- DIRSTACK=()
- DISPLAY=:0.0
- DOLLAR=99
- ......
復(fù)制代碼 s e t輸出可能很長(zhǎng)。查看輸出時(shí)可以看出s h e l l已經(jīng)設(shè)置了一些用戶(hù)變量以使工作環(huán)境更加
容易使用。
結(jié)合變量值
將變量并排可以使變量結(jié)合在一起:- $ FIRST="Bruce "
- $ SURNAME=Willis
- $ echo ${FIRST}${SURNAME}
- Bruce Willis
復(fù)制代碼 測(cè)試變量是否已經(jīng)設(shè)置
有時(shí)要測(cè)試是否已設(shè)置或初始化變量。如果未設(shè)置或初始化,就可以使用另一值。此命
令格式為:
$ { v a r i a b l e : - v a l u e }
意即如果設(shè)置了變量值,則使用它,如果未設(shè)置,則取新值。例如:- $ COLOUR=blue
- $ echo "The sky is ${COLOR:-grey} today"
- The sky is grey today
復(fù)制代碼 變量c o l o u r取值b l u e,e c h o打印變量c o l o u r時(shí),首先查看其是否已賦值,如果查到,則使
用該值。變量$COLOR沒(méi)有設(shè)置,所以會(huì)打印后面的grey
上面的例子并沒(méi)有將實(shí)際值傳給變量,需使用下述命令完成此功能:
$ { v a r i a b l e : = v a l u e }
下面是一個(gè)更實(shí)用的例子。查詢(xún)工資清單應(yīng)用的運(yùn)行時(shí)間及清單類(lèi)型。在運(yùn)行時(shí)間及類(lèi)
型輸入時(shí),敲回車(chē)鍵表明用戶(hù)并沒(méi)有設(shè)置兩個(gè)變量值,將使用缺省值( 0 3 : 0 0和We e k l y),并
傳入a t命令中以按時(shí)啟動(dòng)作業(yè)。- #!/bin/bash
- # vartest
- echo "what time do you wish start the payroll [03:00]:"
- read TIME
- echo " process to start at ${TIME:=03:00} OK"
- echo "Is it a monthly or weekly run [Weekly]:"
- read RUN_TYPE
- echo "Run type is ${RUN_TYPE:=Weekly}'
- at -f $RUN_TYPE $TIME
復(fù)制代碼 在輸入域敲回車(chē)鍵,輸出結(jié)果如下:
what time do you wish start the payroll [03:00]:
process to start at 03:00 OK
Is it a monthly or weekly run [Weekly]:
Run type is Weekly
也可以編寫(xiě)腳本測(cè)試變量是否取值,然后返回帶有系統(tǒng)錯(cuò)誤信息的結(jié)果。下面的例子測(cè)
試變量f i l e是否取值。- $ echo "The file is ${FILES:?}"
- bash: FILES: parameter null or not set
復(fù)制代碼 以上結(jié)果可讀性不好,但是可以加入自己的腳本以增加可讀性。- $ echo "The file is ${FILES:?" sorry cannot locate the variable files"}"
- bash: FILES: sorry cannot locate the variable files
復(fù)制代碼 測(cè)試變量是否取值,如果未設(shè)置,則返回一空串。方法如下:
$ { v a r i a b l e : + v a l u e }
使用下述方法初始化變量為空字符串。
v a r i a b l e = " "
$ D E T I N A T I O N = " "
使用變量來(lái)保存系統(tǒng)命令參數(shù)
可以用變量保存系統(tǒng)命令參數(shù)的替換信息。下面的例子使用變量保存文件拷貝的文件名
信息。變量s o u r c e保存p a s s w d文件的路徑,d e s t保存c p命令中文件目標(biāo)。- $ SOURCE="/etc/passwd"
- $ DEST="/tmp/passwd.bak"
- $ cp ${SOURCE} ${DEST}
復(fù)制代碼 下面例子中,變量d e v i c e保存磁帶設(shè)備路徑,然后用于在m t命令中倒帶。- $ DEVICE="/dev/rmt/0n"
- $ mt -f {DEVICE} rewind
復(fù)制代碼 設(shè)置只讀變量
如果設(shè)置變量時(shí),不想再改變其值,可以將之設(shè)置為只讀方式。如果有人包括用戶(hù)本人
想要改變它,則返回錯(cuò)誤信息。格式如下:
v a r i a b l e - n a m e = v a l u e
readonly variable-name
下面的例子中,設(shè)置變量為系統(tǒng)磁帶設(shè)備之一的設(shè)備路徑,將之設(shè)為只讀,任何改變其值的操作將返回錯(cuò)誤信息。- $ TAPE_DEV="/dev/rmt/0n"
- $ echo ${TAPE_DEV}
- /dev/rmt/0n
- $ readonly TAPE_DEV
- $ TAPE_DEV="/dev/rmt/1n"
- bash: TAPE_DEV: readonly variable
復(fù)制代碼 要查看所有只讀變量,使用命令r e a d o n l y即可。- $ readonly
- declare -ir BASHPID=""
- declare -ar BASH_VERSINFO='([0]="4" [1]="0" [2]="23" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu")'
- declare -ir EUID="500"
- declare -ir PPID="2813"
- declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"
- declare -r TAPE_DEV="/dev/rmt/0n"
- declare -ir UID="500"
復(fù)制代碼 |
|