亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: shell基礎第十四篇-環(huán)境和shell變量 [打印本頁]

作者: L_kernel    時間: 2010-11-19 20:24
標題: shell基礎第十四篇-環(huán)境和shell變量
為使s h e l l編程更有效,系統(tǒng)提供了一些s h e l l變量。s h e l l變量可以保存諸如路徑名、文件
名或者一個數(shù)字這樣的變量名。s h e l l將其中任何設置都看做文本字符串。
有兩種變量,本地和環(huán)境。
補充:這里似乎不全面,我們似乎更傾向于這種分法,應該是用戶自定義變量,通常我們使用小寫字符表示,和環(huán)境變量,通常用全部大寫字符表示,比如PATH,這是我們執(zhí)行命令的搜索路徑。LIBRARY_PATH鏈接庫的路徑。還有局部變量,也就是上面說的本地變量。只是在一定的區(qū)域范圍內有效。
這樣子的話,才好區(qū)分。

嚴格地說可以有4種,但其余兩種是只讀的,可以認為是特殊
變量,它用于向s h e l l腳本傳遞參數(shù)。
本章內容有:
• shell變量。
• 環(huán)境變量。
• 變量替換。
• 導出變量。
• 特定變量。
• 向腳本傳遞信息。
• 在系統(tǒng)命令行下使用位置參數(shù)。


什么是shell變量?
變量可以定制用戶本身的工作環(huán)境。使用變量可以保存有用信息,使系統(tǒng)獲知用戶相關
設置。變量也用于保存暫時信息。例如:一變量為E D I TO R,系統(tǒng)中有許多編輯工具,但哪一
個適用于系統(tǒng)呢?將此編輯器名稱賦給E D I TO R,這樣,在使用c r o n或其他需要編輯器的應用
時,這就是你將一直使用的E D I TO R取值,并將之用作缺省編輯器。

變量的命名需要遵守什么規(guī)則?
簡單概括來,有以下一些規(guī)則:
1、變量和變量的內容用"="來連接
2、等號兩邊不能直接解空格字符,如果接上了空格,這時候shell會把變量當作命令嘗試執(zhí)行,而找不到就會提示錯誤
3、變量名稱只能是英文字符和數(shù)字和下劃線,同時數(shù)字不能是開頭字符。
4、若有空格字符,可以使用雙引號或者單引號將內容結合起來。但是要注意,雙引號內的變量可以保持變量的特性,單引號內的僅僅是一般字符。
5、必要時候以轉義字符"\"將其他一些特殊字符變成一般符號。
6、export可以使一個變量編程環(huán)境變量
7、可以使用unset取消變量的定義



本地變量
本地變量在用戶現(xiàn)在的s h e l l生命期的腳本中使用。例如,本地變量f i l e - n a m e取值為
l o o p . d o c,這個值只在用戶當前s h e l l生命期有意義。如果在s h e l l中啟動另一個進程或退出,此
值將無效。這個方法的優(yōu)點就是用戶不能對其他的s h e l l或進程設置此變量有效。
表1 4 - 1列出各種實際變量模式
使用變量時,如果用花括號將之括起來,可以防止s h e l l誤解變量值,盡管不必一定要這樣做,但這確實可用。
要設置一本地變量,格式為:
$ variable-name=valu或e $ { v a r i a b l e - n a m e = v a l u e }
注意,等號兩邊可以有空格。如果取值包含空格,必須用雙引號括起來。s h e l l變量可以
用大小寫字母。

                     表14-1 變量設置時的不同模式
Va r i a b l e - n a m e = v a l u e 設置實際值到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 如果設置了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 如果未設置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 如果未設置v a r i a b l e - n a m e,顯示系統(tǒng)錯誤信息
Va r i a b l e - n a m e : = v a l u e 如果未設置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 同上,但是取值并不設置到v a r i a b l e - n a m e,可以被替換


顯示變量
使用e c h o命令可以顯示單個變量取值,并在變量名前加$,例如:
  1. $ GREAT_PICTURE="die hard"
  2. $ echo ${GREAT_PICTURE}
  3. die hard
  4. $ DOLLAR=99
  5. $ echo ${DOLLAR}
  6. 99
  7. $ LAST_FILE=ZLPSO.txt
  8. $ echo ${LAST_FILE}
  9. ZLPSO.txt
復制代碼
可以結合使用變量,下面將錯誤信息和環(huán)境變量L O G N A M E設置到變量e r r o r- m s g。
  1. $ ERROR_MSG=" Sorry this file does not exist user $LOGNAME"
  2. $ echo ${ERROR_MSG}
  3. Sorry this file does not exist user root
復制代碼
上面例子中,s h e l l首先顯示文本,然后查找變量$ L O G N A M E,最后擴展變量以顯示整個
變量值。

清除變量
使用u n s e t命令清除變量。
unset variable-name
  1. $ PC=enterprise
  2. $ echo ${PC}
  3. enterprise
  4. $ unset PC
  5. $ echo ${PC}
復制代碼
顯示所有本地shell變量
  1. $ set
  2. ......
  3. BASH_VERSION='4.0.23(1)-release'
  4. COLORS=/etc/DIR_COLORS
  5. COLORTERM=gnome-terminal
  6. COLUMNS=80
  7. CVS_RSH=ssh
  8. DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-MmGXVtOFZ0,guid=604b8af6bd4ce1a0b825456b4ce79674
  9. DESKTOP_SESSION=gnome
  10. DIRSTACK=()
  11. DISPLAY=:0.0
  12. DOLLAR=99
  13. ......
復制代碼
s e t輸出可能很長。查看輸出時可以看出s h e l l已經設置了一些用戶變量以使工作環(huán)境更加
容易使用。

結合變量值
將變量并排可以使變量結合在一起:
  1. $ FIRST="Bruce "
  2. $ SURNAME=Willis
  3. $ echo ${FIRST}${SURNAME}
  4. Bruce Willis
復制代碼
測試變量是否已經設置
有時要測試是否已設置或初始化變量。如果未設置或初始化,就可以使用另一值。此命
令格式為:
$ { v a r i a b l e : - v a l u e }
意即如果設置了變量值,則使用它,如果未設置,則取新值。例如:
  1. $ COLOUR=blue
  2. $ echo "The sky is ${COLOR:-grey} today"
  3. The sky is grey today
復制代碼
變量c o l o u r取值b l u e,e c h o打印變量c o l o u r時,首先查看其是否已賦值,如果查到,則使
用該值。變量$COLOR沒有設置,所以會打印后面的grey

上面的例子并沒有將實際值傳給變量,需使用下述命令完成此功能:
$ { v a r i a b l e : = v a l u e }
下面是一個更實用的例子。查詢工資清單應用的運行時間及清單類型。在運行時間及類
型輸入時,敲回車鍵表明用戶并沒有設置兩個變量值,將使用缺省值( 0 3 : 0 0和We e k l y),并
傳入a t命令中以按時啟動作業(yè)。
  1. #!/bin/bash
  2. # vartest
  3. echo "what time do you wish start the payroll [03:00]:"
  4. read TIME
  5. echo " process to start at ${TIME:=03:00} OK"
  6. echo "Is it a monthly or weekly run [Weekly]:"
  7. read RUN_TYPE
  8. echo "Run type is ${RUN_TYPE:=Weekly}'
  9. at -f $RUN_TYPE $TIME
復制代碼
在輸入域敲回車鍵,輸出結果如下:
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


也可以編寫腳本測試變量是否取值,然后返回帶有系統(tǒng)錯誤信息的結果。下面的例子測
試變量f i l e是否取值。
  1. $ echo "The file is ${FILES:?}"
  2. bash: FILES: parameter null or not set
復制代碼
以上結果可讀性不好,但是可以加入自己的腳本以增加可讀性。
  1. $ echo "The file is ${FILES:?" sorry cannot locate the variable files"}"
  2. bash: FILES:  sorry cannot locate the variable files
復制代碼
測試變量是否取值,如果未設置,則返回一空串。方法如下:
$ { 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 = " "

使用變量來保存系統(tǒng)命令參數(shù)
可以用變量保存系統(tǒng)命令參數(shù)的替換信息。下面的例子使用變量保存文件拷貝的文件名
信息。變量s o u r c e保存p a s s w d文件的路徑,d e s t保存c p命令中文件目標。
  1. $ SOURCE="/etc/passwd"
  2. $ DEST="/tmp/passwd.bak"
  3. $ cp ${SOURCE} ${DEST}
復制代碼
下面例子中,變量d e v i c e保存磁帶設備路徑,然后用于在m t命令中倒帶。
  1. $ DEVICE="/dev/rmt/0n"
  2. $ mt -f {DEVICE} rewind
復制代碼
設置只讀變量
如果設置變量時,不想再改變其值,可以將之設置為只讀方式。如果有人包括用戶本人
想要改變它,則返回錯誤信息。格式如下:
v a r i a b l e - n a m e = v a l u e
readonly variable-name
下面的例子中,設置變量為系統(tǒng)磁帶設備之一的設備路徑,將之設為只讀,任何改變其值的操作將返回錯誤信息。
  1. $ TAPE_DEV="/dev/rmt/0n"
  2. $ echo ${TAPE_DEV}
  3. /dev/rmt/0n
  4. $ readonly TAPE_DEV
  5. $ TAPE_DEV="/dev/rmt/1n"
  6. bash: TAPE_DEV: readonly variable
復制代碼
要查看所有只讀變量,使用命令r e a d o n l y即可。
  1. $ readonly
  2. declare -ir BASHPID=""
  3. declare -ar BASH_VERSINFO='([0]="4" [1]="0" [2]="23" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu")'
  4. declare -ir EUID="500"
  5. declare -ir PPID="2813"
  6. declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"
  7. declare -r TAPE_DEV="/dev/rmt/0n"
  8. declare -ir UID="500"
復制代碼

作者: liaosnet    時間: 2010-11-19 20:57

作者: L_kernel    時間: 2010-11-19 21:22
位置變量參數(shù)
本章開始提到有4種變量,本地、環(huán)境,還有兩種變量被認為是特殊變量,因為它們是只
讀的。這兩種變量即為位置變量和特定變量參數(shù)。先來看一看位置變量。
如果要向一個s h e l l腳本傳遞信息,可以使用位置參數(shù)完成此功能。參數(shù)相關數(shù)目傳入腳
本,此數(shù)目可以任意多,但只有前9個可以被訪問,使用s h i f t命令可以改變這個限制。本書后
面將講到s h i f t命令。參數(shù)從第一個開始,在第9個結束;每個訪問參數(shù)前要加$符號。第一個
參數(shù)為0,表示預留保存實際腳本名字。無論腳本是否有參數(shù),此值均可用。
如果向腳本傳送Did You See Th e Full Mo o n信息,下面的表格講解了如何訪問每一個參
數(shù)。
$ 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
在腳本中使用位置參數(shù)
在下面腳本中使用上面的例子。
  1. [mutter@localhost ~] $ cat param.sh
  2. #!/bin/bash
  3. # param
  4. echo "This is the script name                : $0"
  5. echo "This is the first parameter        : $1"
  6. echo "This is the second parameter        : $2"
  7. echo "This is the third parameter        : $3"
  8. echo "This is the fourth parameter        : $4"
  9. echo "This is the fifth parameter        : $5"
  10. echo "This is the sixth parameter        : $6"
  11. echo "This is the seventh parameter        : $7"
  12. echo "This is the eighth parameter        : $8"
  13. echo "This is the ninth parameter        : $9"
復制代碼
運行結果如下:
  1. [mutter@localhost ~] $ sh param.sh Did You See The Full Moon
  2. This is the script name                : param.sh
  3. This is the first parameter        : Did
  4. This is the second parameter        : You
  5. This is the third parameter        : See
  6. This is the fourth parameter        : The
  7. This is the fifth parameter        : Full
  8. This is the sixth parameter        : Moon
  9. This is the seventh parameter        :
  10. This is the eighth parameter        :
  11. This is the ninth parameter        :
復制代碼
這里只傳遞6個參數(shù),7、8、9參數(shù)為空,正像預計的那樣。注意,第一個參數(shù)表示腳本
名,當從腳本中處置錯誤信息時,此參數(shù)有很大作用。
下面的例子返回腳本名稱。
  1. [mutter@localhost ~] $ cat param2.sh
  2. #!/bin/bash
  3. echo "Hello world this is $0 calling"
復制代碼
  1. [mutter@localhost ~] $./param2.sh
  2. Hello world this is ./param2.sh calling
復制代碼
注意$ 0返回當前目錄路徑,如果只返回腳本名,在b a s e n a m e命令下參數(shù)設為$ 0,剛好得
到腳本名字。
  1. [mutter@localhost ~] $ cat param2.sh
  2. #!/bin/bash
  3. echo "Hello world this is `basename $0` calling"
復制代碼
  1. [mutter@localhost ~] $./param2.sh
  2. Hello world this is param2.sh calling
復制代碼
向系統(tǒng)命令傳遞參數(shù)
可以在腳本中向系統(tǒng)命令傳遞參數(shù)。下面的例子中,在f i n d命令里,使用$ 1參數(shù)指定查
找文件名。
  1. $ cat findfile.sh
  2. #!/bin/bash
  3. # findfile
  4. find / -name $1 -print
復制代碼
  1. $ ./findfile passwd
  2. /etc/passwd
  3. /usr/bin/passwd
復制代碼
每臺機器的輸出結果可能不同。

另一個例子中,以$ 1向g r e p傳遞一個用戶i d號, g r e p使用此i d號在p a s s w d中查找用戶全
名。
  1. [mutter@localhost ~] $ cat who_is.sh
  2. #!/bin/bash
  3. # who_is
  4. grep $1 /etc/passwd | awk -F: '{print $4}'
  5. [mutter@localhost ~] $ sh who_is.sh mutter
  6. 502
復制代碼
特定變量參數(shù)
既然已經知道了如何訪問和使用s h e l l腳本中的參數(shù),多知道一點相關信息也是很有用的,
有必要知道腳本運行時的一些相關控制信息,這就是特定變量的由來。共有7個特定變量,見
表1 4 - 2。
表14-2 特定s h e l l變量
$ # 傳遞到腳本的參數(shù)個數(shù)
$ * 以一個單字符串顯示所有向腳本傳遞的參數(shù)。與位置變量不同,此選項參數(shù)可超過9個
$ $ 腳本運行的當前進程I D號
$ ! 后臺運行的最后一個進程的進程I D號
$ @ 與$ #相同,但是使用時加引號,并在引號中返回每個參數(shù)
$ - 顯示s h e l l使用的當前選項,與s e t命令功能相同
$ ? 顯示最后命令的退出狀態(tài)。0表示沒有錯誤,其他任何值表明有錯誤。


現(xiàn)在來修改腳本p a r a m并替換各種特定變量,與以前的例子不同,用不同的傳遞文本重新
運行腳本。
  1. [mutter@localhost ~] $ cat param.sh
  2. #!/bin/bash
  3. # param
  4. echo "This is the script name                : $0"
  5. echo "This is the first parameter        : $1"
  6. echo "This is the second parameter        : $2"
  7. echo "This is the third parameter        : $3"
  8. echo "This is the fourth parameter        : $4"
  9. echo "This is the fifth parameter        : $5"
  10. echo "This is the sixth parameter        : $6"
  11. echo "This is the seventh parameter        : $7"
  12. echo "This is the eighth parameter        : $8"
  13. echo "This is the ninth parameter        : $9"
  14. echo "The number of arguments passed        : $#"
  15. echo "Show all arguments                : $*"
  16. echo "Show me my process ID                : $"
  17. echo "Show me the arguments in quotes        :" "$@"
  18. echo "Did my script go with any errors        : $?"
  19. [mutter@localhost ~] $ sh param.sh Merry Christmas Mr Lawrence
  20. This is the script name                : param.sh
  21. This is the first parameter        : Merry
  22. This is the second parameter        : Christmas
  23. This is the third parameter        : Mr
  24. This is the fourth parameter        : Lawrence
  25. This is the fifth parameter        :
  26. This is the sixth parameter        :
  27. This is the seventh parameter        :
  28. This is the eighth parameter        :
  29. This is the ninth parameter        :
  30. The number of arguments passed        : 4
  31. Show all arguments                : Merry Christmas Mr Lawrence
  32. Show me my process ID                : 7564
  33. Show me the arguments in quotes        : Merry Christmas Mr Lawrence
  34. Did my script go with any errors        : 0
復制代碼
特定變量的輸出使用戶獲知更多的腳本相關信息?梢詸z查傳遞了多少參數(shù),進程相應
的I D號,以免我們想殺掉此進程。

最后的退出狀態(tài)
注意,$ ?返回0?梢栽谌魏蚊罨蚰_本中返回此變量以獲得返回信息;诖诵畔,可
以在腳本中做更進一步的研究,返回0意味著成功,1為出現(xiàn)錯誤。
下面的例子拷貝文件到/ t m p,并使用$ ?檢查結果。
  1. [mutter@localhost ~] $ cp ok.txt /tmp
  2. cp: cannot stat `ok.txt': No such file or directory
  3. [mutter@localhost ~] $ echo $?
  4. 1
復制代碼
使用$ ?檢驗返回狀態(tài),可知腳本有錯誤,但同時發(fā)現(xiàn)c p:c a n n o t . . .,因此檢驗最后退出狀
態(tài)已沒有必要。在腳本中可以用系統(tǒng)命令處理輸出格式,要求命令輸出不顯示在屏幕上。為
此可以將輸出重定向到/ d e v / n u l l,即系統(tǒng)b i n中,F(xiàn)在怎樣才能知道腳本正確與否?好,這時
可以用最后退出狀態(tài)命令了。請看上一個例子的此形式的實際操作結果。
  1. [mutter@localhost ~] $ cp ok.txt /tmp >/dev/null 2>&1
  2. [mutter@localhost ~] $ echo $?
  3. 1
復制代碼
通過將包含錯誤信息的輸出重定向到系統(tǒng)b i n中,不能獲知最后命令返回狀態(tài),但是通過
使用$ !,(其返回值為1)可知腳本失敗。
檢驗腳本退出狀態(tài)時,最好將返回值設置為一個有意義的名字,這樣可以增加腳本的可
讀性。
  1. [mutter@localhost ~] $ cp ok.txt /tmp >/dev/null 2>&1
  2. [mutter@localhost ~] $ cp_status=$?
  3. [mutter@localhost ~] $ echo $cp_status
  4. 1
復制代碼

作者: L_kernel    時間: 2010-11-19 21:23
小結
變量可以使s h e l l編程更容易。它能夠保存輸入值并提高效率。s h e l l變量幾乎可以包含任
何值。特定變量增強了腳本的功能并提供了傳遞到腳本的參數(shù)的更多信息。
END
第十四篇-環(huán)境和shell變量結束
作者: dibug    時間: 2010-11-19 21:51
樓主辛苦啦
作者: ajdan4q    時間: 2010-11-20 02:00
好長,好累。捧一下樓主的場。。
作者: icybay    時間: 2011-08-17 17:08
好東西,繼續(xù)頂
作者: zfwslf    時間: 2011-12-01 01:10
大力支持樓主啊 真的辛苦啦 收藏一下謝謝了
作者: 刺客阿地    時間: 2012-10-30 11:17
大力支持,感謝!
作者: rogantianwz    時間: 2014-02-20 17:36
閱讀完畢,做個記號
作者: jeffreyst    時間: 2014-02-20 19:04
支持樓主分享,多謝~!




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2