1. 程式人生 > >shell筆記之變數

shell筆記之變數

什麼是變數

 變數即在程式執行過程中它的值是允許改變的量

變數的型別

全域性變數(環境變數)
 系統預設定義好的,大寫字母組成,哪裡都可以使用
自定義全域性變數方法注意
 變數名大寫
 定義變數時需要使用export命令
      01.export I=1
 	  02.I=1;export I
 	  03.declare -x I=1
 檢視系統變數 --env
      $HOME       使用者登入時進入的目錄
      $UID        當前使用者的UID(使用者標識)相當於id-u 
	  $PWD        當前工作目錄的絕對路徑名 
	  $SHELL      當前shell 
	  $USER       當前使用者
 取消變數     --unset
 永久生效     --/etc/profile
區域性變數(自定義變數)
 在當前指令碼中使用的變數(函式呼叫,指令碼本身)
自定義區域性變數方法注意
 01.將命令資訊定義成變數
     date_info=`date +%F`($(date +%F))
	 PS:比較長的命令(多個管道)不建議!
 02.將字串資訊定義成變數
     字串作為變數名使用時:字母、下劃線開頭
	 字串作為變數值使用時:字母、數字、下劃線
	 字串作為變數名使用時,需要配合引號使用:
	     雙引號:可以解析變數值資訊
	     單引號:所見即所得
	     反引號:可以解析命令(ls)
	     不加:相當於加雙引號
定義變數時命名規範
 變數名稱有意義;駝峰語法(每個單詞首字母大寫)。
呼叫變數資訊
 1. echo $變數名稱	
 2. 利用let定義變數運算資訊
 [[email protected]_ser]# oldboy=12
 [[email protected]_ser]# let oldgirl=$oldboy+1
 [[email protected]_ser]# echo $oldgirl
 13
 3. 利用declare定義變數運算???
 [[email protected]_ser]# declare -i oldboy=$oldgirl+1
 [[email protected]
_ser]# echo $oldboy 14
特殊變數
$0 呼叫指令碼名
 [[email protected]_ser ]# cat test01.sh
 echo $0
 [[email protected]_ser ]# sh test01.sh 
 test01.sh
 企業應用
 echo "Usage: $0 {1|2}"
$n 定義指令碼傳參的引數資訊(每個引數之間空格分割、引號匯聚)
 PS:當傳參個數大於9時,新增{} --${10}
 企業應用(case)
$# 獲得傳參的個數資訊
 [[email protected]_ser ]# cat test01.sh 
 if [ $# -ne 2 ];
 then
     echo "Usage: $0 {1|2}"
     exit 1
 else
     echo $1 $2
 fi
 [[email protected]_ser]# sh test01.sh
 Usage: test01.sh {1|2}
 [[email protected]_ser]# sh test01.sh 1 2
 1 2
$* [email protected]
 $*  顯示傳參的引數資訊,整體方式進行獲取
 [email protected]  顯示傳參的引數資訊,個體方式進行獲取
測試
 [[email protected]_ser]# set -- "i am" cool boy
 [[email protected]_ser]# echo $#
 3
 [[email protected]_ser]# echo $1
 i am
 [[email protected]_ser]# echo $2
 cool
 [[email protected]_ser]# echo $3
 boy
 [[email protected]_ser]# for n in "$*";do echo $n;done
 i am cool boy
 [[email protected]_ser]# for n in "[email protected]";do echo $n;done
 i am
 cool
 boy
特殊變數(程序狀態)
 $?  --顯示返回值資訊(0表示上一個命令執行成功,非0為失敗)
 $$  --記錄指令碼執行時程序號資訊
 $!  --記錄上一個指令碼的PID
 $_  --在此之前執行的命令或指令碼的後一個引數
 [[email protected]_ser]# sh test02.sh 1 2 3 4
 1 2 3 4
 [[email protected]_ser]# echo $_
 4

變數擴充套件

變數子串
${parameter:offset}   --- $parameter中, 從offset位置之後進行取值, 一直到結尾
     [[email protected] scripts]# oldboy="abc123ABC123abc"
     [[email protected] scripts]# echo ${oldboy:1}
     bc123ABC123abc
     [[email protected] scripts]# echo ${oldboy:3}
     123ABC123abc

 ${string:position:length} ---在$string中,從位置$position之後開始提取長度為$length的子串
     [[email protected] scripts]# oldboy="abc123ABC123abc"
     [[email protected] scripts]# echo ${oldboy:3:3}
     123	

 ${parameter#word}        ---從字串開始進行匹配word字串資訊, 刪除最短匹配的子串word資訊
 ${parameter##word}       ---從字串開始進行匹配word字串資訊, 刪除最長匹配的子串word資訊
     [[email protected] scripts]# oldboy="abcefgabcefg"
     [[email protected] scripts]# echo ${oldboy#a*c}
     efgabcefg
     [[email protected] scripts]# echo ${oldboy##a*c}
     efg
     
 ${parameter%word}        ---從字串結尾進行匹配word字串資訊, 刪除最短匹配的子串word資訊
     [[email protected] scripts]# echo ${oldboy%efg}
     abcefgabc
     [[email protected] scripts]# echo ${oldboy%%efg}
     abcefgabc 
     
 ${parameter/string/replace}   --- 替換變數中字串內容, 使用replace字串替換第一個匹配的string字串資訊
 ${parameter//string/replace}  --- 替換變數中字串內容, 使用replace字串替換所有匹配的string字串資訊
     [[email protected] scripts]# echo ${oldboy/abc/cba}
     cbaefgabcefg
     [[email protected] scripts]# oldboy="abcefgabcefg"
     [[email protected] scripts]# echo ${oldboy//abc/cba}
     cbaefgcbaefg
變數替換
 $(value:-word)     ---當變數未定義或者值為空時,返回值為word內容,否則返回變數的值。
     [[email protected] scripts]# oldboy=
     [[email protected] scripts]# echo ${oldboy}
     
     [[email protected] scripts]# echo ${oldboy:-laowang}
     laowang
 
 $(value:=word)     ---若變數未定義或者值為空時,在返回word的值的同時將word賦值給value
     [[email protected] scripts]# oldboy=
     [[email protected] scripts]# echo ${oldboy:=laowang}
     laowang
     
     [[email protected] scripts]# oldboy=xiaogang
     [[email protected] scripts]# echo ${oldboy:-laowang}
     xiaogang
     [[email protected] scripts]# echo ${oldboy:=laowang}
     xiaogang
     [[email protected] scripts]# oldboy=        
     [[email protected] scripts]# echo ${oldboy:-laowang}
     laowang
     [[email protected] scripts]# echo $oldboy
     
     [[email protected] scripts]# echo ${oldboy:=laowang}
     laowang
     [[email protected] scripts]# echo $oldboy
     laowang
 
 $(value:?"word")   ---定義一個變數如果存在時,輸出變數值; 定義變數不存在時,利用bash顯示指定報錯資訊
     [[email protected] scripts]# echo ${oldboy:?error_info}
     -bash: oldboy: error_info
     [[email protected] scripts]# oldboy=123             
     [[email protected] scripts]# echo ${oldboy:?error_info}
     123
 
 $(value:+word)     ---未定義value的數值,即沒有變數值,無輸出;  
                       定義了value的變數資訊,即有變數值儲存在,可以輸出1用於表示有變數存在	
    
     [[email protected] scripts]# echo $oldboy
     
     [[email protected] scripts]# echo ${oldboy:+1}
     
     [[email protected] scripts]# echo ${oldboy:+0}
     
     [[email protected] scripts]# oldboy=123456
     [[email protected] scripts]# echo ${oldboy:+0}
     0
     [[email protected] scripts]# echo ${oldboy:+abc}
     abc

企業擴充套件

01.i am a cool boy ,取出小於3的字串
 cat test03.sh
 for n in i am a cool boy;
 do
     if [ ${#n} -lt 3 ];
     then
         echo $n;
     fi
 done