Linux shell程序設(shè)計(jì)(四).變量-2
?
??? 變量的內(nèi)容很多,繼續(xù)接著昨天的。這次包括:位置變量、預(yù)定義變量、環(huán)境變量。希望能夠都記住。
?
?
五、位置參數(shù)
?
1、位置參數(shù)及其引用
?
??? Linux可以用位置參數(shù)來(lái)定義命令行上的具體實(shí)參,例如:
??? $ set `pwd;ls;date`
??? $ echo $0 $1 $2 $3 $4 $5 $6 $11 ${11}
??? -bash /opt/test a bbb kkk nnn Thu /opt/test1 2009
?
??? 由上例可見:
??? ① $0對(duì)應(yīng)的是命令名(腳本名)
??? ② $n對(duì)應(yīng)第n個(gè)字符串(以空格隔開)
??? ③ $11對(duì)應(yīng)的是$1再跟上"1",若需要顯示第11個(gè)參數(shù),使用${11}
?
??? 再舉一個(gè)例子:
??? $ cat m1.c
??????? main()
??????? {
??????????? printf("Begin\n");
??????? }
??? $ cat m2.c
??? main()
??? {
??????? print("OK!\n");
??????? print("End!\n");
??? }
??? $ cat ex6
??????? # ex6:shell script to combine files and count lines
????????? cat $1 $2 $3 $4 $5 $6 $7 $8 $9 | wc -l
??????? # end
??? $ ./ex6 m1.c m2.c
????? 9
?
??? 這段代碼的意思是:依次打印ex6腳本后面帶的實(shí)參指定的文件后計(jì)算行數(shù)(最多9個(gè))
?
2、用set命令為位置參數(shù)賦值
?
??? 可以利用set命令為位置參數(shù)賦值或重新賦值,例如:
??? $ set a b c
??? $ echo $0 $1 $3
????? -bash a c
??? 再舉個(gè)應(yīng)用的例子:
??? $ cat ex7
??????? #!/bin/bash
??????? set m1.c m2.c
??????? cat $1 $2 $3 | wc -l
??? $ ./ex7
????? 9
?
3、移動(dòng)位置參數(shù)
?
??? 可以使用shift命令移動(dòng)除$0外的所有參數(shù)的位置(向右順移)
?
??? $ cat ex8
??????? #!/bin/bash
??????? echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9
??????? shift
??????? echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9
??????? shift 4
??????? echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9
??????? #end
??? $ ./ex8 A B V F G T R E D S
????? ./ex8 A B V F G T R E D
????? ./ex8 B V F G T R E D S
????? ./ex8 T R E D S
?
?
六、預(yù)先定義的特殊變量
?
??? ① $#:表示命令上上的參數(shù)個(gè)數(shù)(不包含命令本身)
??? ② $?:上一條命令執(zhí)行后的返回值(執(zhí)行成功為0 | 失敗為非0)
?? ③ $$:當(dāng)前進(jìn)程的進(jìn)程號(hào)
??????? 注:因?yàn)槊總€(gè)進(jìn)程都有唯一進(jìn)程號(hào),所以可以利用$$作為臨時(shí)文件的唯一文件名。
?? ④ $!:上一個(gè)后臺(tái)命令對(duì)應(yīng)的進(jìn)程號(hào)(是一個(gè)由1-5個(gè)數(shù)字構(gòu)成的字符串)
??? ⑤ $-:當(dāng)前shell設(shè)置的執(zhí)行標(biāo)識(shí)名
??????? $ set -xv
??????? $ echo display current shell flags $-
????????? display current shell flags himvxBH
?? ⑥ $*:列出所有的參數(shù)
??? ⑦ $@:基本與$*相同。區(qū)別在于:
??????? $ cat ex10
????????? #!/bin/bash
????????? date
????????? set `date`
????????? echo $*
????????? for i in "$*"
????????? do echo $i;
????????? done
????????? echo $@
????????? for i in "$@"
????????? do echo $i;
????????? done
????????? echo "end."
??????? $ ./ex10
????????? Thu Mar 5 16:59:01 CST 2009
????????? Thu Mar 5 16:59:01 CST 2009
????????? Thu Mar 5 16:59:01 CST 2009
????????? Thu Mar 5 16:59:01 CST 2009
????????? Thu
????????? Mar
????????? 5
????????? 16:59:01
????????? CST
????????? 2009
????????? end.
????? 發(fā)現(xiàn)$@在for循環(huán)時(shí)將各個(gè)參數(shù)分解,而$*不變
?
?
七、環(huán)境變量
?
??? 在bash、sh、ksh中可以使用env命令以及不帶參數(shù)的set命令列出所有已定義的環(huán)境變量。
?
?1、常用環(huán)境變量
?
?
??? ① HOME:用戶主目錄的全路徑名
?
??? 默認(rèn)為:/home/userid
??? 可以使用 cd $HOME | cd ~ | cd 來(lái)切換回主目錄路徑。
?
??? ② LOGNAME:注冊(cè)名,由Linux自動(dòng)設(shè)置
?
??? 可以通過(guò)LOGNAME變量使系統(tǒng)確認(rèn)文件的擁有著,有權(quán)執(zhí)行某個(gè)命令。
?
??? ③ MAIL:系統(tǒng)郵箱的地址
?
??? 默認(rèn)為:/var/spool/mail/userid
?
??? ④ PATH:shell從中查找命令的目錄列表
?
??? 多個(gè)目錄以“:”分開,可以使用以下命令添加目錄:
??? $ PATN=$PATH:$HOME/bin
??? 一般用戶自身的命令存放在 /usr/local/bin 目錄下
?
??? ⑤ PS1:shell的主提示符
?
??? 默認(rèn)為:\s-\v\$
??? 具體的參數(shù)說(shuō)明如下:
??? \d:以“星期 月 日”形式的日期
??? \h:主機(jī)名,直至第一個(gè)“.”為止
?? \H:主機(jī)全名
??? \s:所用的shell名稱
??? \t:按24小時(shí)制形式表現(xiàn)的時(shí)間
??? \T:按12小時(shí)制形式表現(xiàn)的時(shí)間
??? \@:按12小時(shí)制am/mp形式表示的時(shí)間
??? \u:當(dāng)前用戶名
?? \v:bash版本號(hào)
?? \w:當(dāng)前工作目錄
?? \$:若有效UID為0,則為“#”,否則為“$”
?
??? ⑥ PWD:當(dāng)前工作目錄路徑
?
??? ⑦ SHELL:當(dāng)前使用的shell及解釋程序位置
?
??? ⑧ TERM:終端類型
?
??? 本機(jī):vt100
?
2、使用環(huán)境變量
?
??? 用echo命令查看任何一個(gè)環(huán)境變量
??? $ echo $SHELL
??????? /bin/bash
?
??? 注:由上可知,用“$”可以引用任何的環(huán)境變量作為變量使用
?
3、刪除環(huán)境變量
?
??? $ unset NAME
??? 注:不要加“$”
?
?
?
?