Linux shell程序設計(四).變量-2
?
??? 變量的內容很多,繼續接著昨天的。這次包括:位置變量、預定義變量、環境變量。希望能夠都記住。
?
?
五、位置參數
?
1、位置參數及其引用
?
??? Linux可以用位置參數來定義命令行上的具體實參,例如:
??? $ 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對應的是命令名(腳本名)
??? ② $n對應第n個字符串(以空格隔開)
??? ③ $11對應的是$1再跟上"1",若需要顯示第11個參數,使用${11}
?
??? 再舉一個例子:
??? $ 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腳本后面帶的實參指定的文件后計算行數(最多9個)
?
2、用set命令為位置參數賦值
?
??? 可以利用set命令為位置參數賦值或重新賦值,例如:
??? $ set a b c
??? $ echo $0 $1 $3
????? -bash a c
??? 再舉個應用的例子:
??? $ cat ex7
??????? #!/bin/bash
??????? set m1.c m2.c
??????? cat $1 $2 $3 | wc -l
??? $ ./ex7
????? 9
?
3、移動位置參數
?
??? 可以使用shift命令移動除$0外的所有參數的位置(向右順移)
?
??? $ 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
?
?
六、預先定義的特殊變量
?
??? ① $#:表示命令上上的參數個數(不包含命令本身)
??? ② $?:上一條命令執行后的返回值(執行成功為0 | 失敗為非0)
?? ③ $$:當前進程的進程號
??????? 注:因為每個進程都有唯一進程號,所以可以利用$$作為臨時文件的唯一文件名。
?? ④ $!:上一個后臺命令對應的進程號(是一個由1-5個數字構成的字符串)
??? ⑤ $-:當前shell設置的執行標識名
??????? $ set -xv
??????? $ echo display current shell flags $-
????????? display current shell flags himvxBH
?? ⑥ $*:列出所有的參數
??? ⑦ $@:基本與$*相同。區別在于:
??????? $ 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.
????? 發現$@在for循環時將各個參數分解,而$*不變
?
?
七、環境變量
?
??? 在bash、sh、ksh中可以使用env命令以及不帶參數的set命令列出所有已定義的環境變量。
?
?1、常用環境變量
?
?
??? ① HOME:用戶主目錄的全路徑名
?
??? 默認為:/home/userid
??? 可以使用 cd $HOME | cd ~ | cd 來切換回主目錄路徑。
?
??? ② LOGNAME:注冊名,由Linux自動設置
?
??? 可以通過LOGNAME變量使系統確認文件的擁有著,有權執行某個命令。
?
??? ③ MAIL:系統郵箱的地址
?
??? 默認為:/var/spool/mail/userid
?
??? ④ PATH:shell從中查找命令的目錄列表
?
??? 多個目錄以“:”分開,可以使用以下命令添加目錄:
??? $ PATN=$PATH:$HOME/bin
??? 一般用戶自身的命令存放在 /usr/local/bin 目錄下
?
??? ⑤ PS1:shell的主提示符
?
??? 默認為:\s-\v\$
??? 具體的參數說明如下:
??? \d:以“星期 月 日”形式的日期
??? \h:主機名,直至第一個“.”為止
?? \H:主機全名
??? \s:所用的shell名稱
??? \t:按24小時制形式表現的時間
??? \T:按12小時制形式表現的時間
??? \@:按12小時制am/mp形式表示的時間
??? \u:當前用戶名
?? \v:bash版本號
?? \w:當前工作目錄
?? \$:若有效UID為0,則為“#”,否則為“$”
?
??? ⑥ PWD:當前工作目錄路徑
?
??? ⑦ SHELL:當前使用的shell及解釋程序位置
?
??? ⑧ TERM:終端類型
?
??? 本機:vt100
?
2、使用環境變量
?
??? 用echo命令查看任何一個環境變量
??? $ echo $SHELL
??????? /bin/bash
?
??? 注:由上可知,用“$”可以引用任何的環境變量作為變量使用
?
3、刪除環境變量
?
??? $ unset NAME
??? 注:不要加“$”
?
?
?
?