一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

shell淺談之十一別名、列表及數(shù)組

 答案95 2015-12-22

一、簡(jiǎn)介

       Shell中別名可以對(duì)命令進(jìn)行重新命名,方便用戶記憶長(zhǎng)命名和定制自己熟悉的工作環(huán)境;列表是一組命名以邏輯與、邏輯或的關(guān)系串在一起,實(shí)現(xiàn)腳本程序的邏輯控制;數(shù)組是一重點(diǎn),涉及數(shù)組的賦值、操作和字符串的處理,以及利用數(shù)組實(shí)現(xiàn)堆棧和二維數(shù)組等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。

二、詳解

1、別名

       對(duì)linux命令重新命名,主要考慮到很多l(xiāng)inux命令帶有冗長(zhǎng)的選項(xiàng)和參數(shù),頻繁使用這些長(zhǎng)命令極易造成用戶使用上的不便。別名的命令關(guān)鍵字是alias,基本格式為alias name='original-command'(等號(hào)兩邊不能有空格)。如alias ipconfig=ifconfig。若要?jiǎng)h除已經(jīng)設(shè)置的別名,使用內(nèi)建命令unalias,unalias -a表示刪除所有已設(shè)置的別名,unalias alias-name表示僅刪除alias-name別名。

  1. #!/bin/bash  
  2.   
  3. shopt -s expand_aliases   #打開expand_aliases選項(xiàng)  
  4. alias detail="ls -l"  
  5. detail /root/in*          #別名支持通配符*  
  6. echo  
  7. directory=/root/  
  8. prefix=in*  
  9. alias vardetail="ls -l $directory$prefix"   #雙引號(hào)和單引號(hào)在處理空格時(shí)是等價(jià)的,  
  10.                                             #但設(shè)置vardetail引用了變量,此處只能使用雙引號(hào)  
  11. vardetail  
  12.   
  13. echo "Deleting all aliases:"  
  14. unalias -a                #刪除所有的別名  
  15. detail  
  16. vardetail  
      若要在腳本中使用別名功能,必須在腳本使用shopt -s expand_aliases命令打開expand_aliases(表示別名可以被擴(kuò)展)選項(xiàng),未打開,alias命令建立的別名不會(huì)執(zhí)行。

      要注意的是:在諸如if/then結(jié)構(gòu)、循環(huán)和函數(shù)等混合型結(jié)構(gòu)中不能使用alias命令設(shè)置別名,但可以執(zhí)行在混合型結(jié)構(gòu)之外所設(shè)置的別名。

2、列表

(1)shell中列表是由一串命令用與運(yùn)算(&&)和或運(yùn)算(||)連接而成,分別稱為與列表和或列表。與列表的格式為:命令1 &&命令2&& 命令3 &&... &&命令n,從左到右依次執(zhí)行命名,直到某命令返回FALSE時(shí)(退出狀態(tài)為非0)與列表執(zhí)行終止。或列表的格式為:命令1 || 命令2 || 命令3 ||... ||命令n,從左到右依次執(zhí)行命名,但是當(dāng)某命令返回TRUE時(shí)(退出狀態(tài)為0)或列表執(zhí)行終止。

(2)與列表控制輸入?yún)?shù)個(gè)數(shù)和返回狀態(tài)碼

  1. #!/bin/bash  
  2.   
  3. MAXARGS=3  
  4. ERROR=68  
  5. test $# -ne $MAXARGS  && echo "Usage: `basename $0` $MAXARGS arguments" && exit $ERROR  
  6. echo "Less than $MAXARGS arguments are passed to this script."  
  7. exit 0  

(3)或列表控制輸入?yún)?shù)個(gè)數(shù)和返回狀態(tài)碼

  1. #!/bin/bash  
  2.   
  3. MAXARGS=3  
  4. ERROR=68  
  5. test $# -eq $MAXARGS  || (echo "Usage: `basename $0` $MAXARGS arguments" && false) || exit $ERROR  
  6. echo "Correct arguments are passed to this script."  
  7. exit 0  
      可以對(duì)比或列表和與列表的語句,由于echo命令總是返回TRUE,要將echo和false進(jìn)行與運(yùn)算從而返回FALSE值。其中test命令實(shí)際上是或列表的嵌套,在使用與或列表嵌套時(shí)需要利用圓括號(hào)區(qū)分邏輯運(yùn)算的優(yōu)先級(jí)。

3、數(shù)組

 (1)賦值和取值

       數(shù)組(Array)是一個(gè)由若干同類型變量組成的集合,數(shù)組均由連續(xù)的存儲(chǔ)單元組成,最低地址對(duì)應(yīng)于數(shù)組的第一個(gè)元素,最高地址對(duì)應(yīng)于最后一個(gè)元素。Shell只支持一維數(shù)組,array[x]表示array數(shù)組的第x+1個(gè)元素,支持的最大數(shù)值標(biāo)號(hào)是599 147 937 791。shell取得數(shù)組值(引用數(shù)組元素)格式是:${array[x]}。

  1. #!/bin/bash  
  2.   
  3. city[0]=Nanjing      #對(duì)第1、2個(gè)數(shù)組元素賦值  
  4. city[1]=Beijing  
  5. city[9]=Melbourne    #對(duì)第10個(gè)數(shù)組元素賦值  
  6. city[15]=NewYork     #對(duì)第16個(gè)數(shù)組元素賦值  
  7.   
  8. echo "city[0]=${city[0]}"  
  9. echo "city[1]=${city[1]}"  
  10. echo "city[9]=${city[9]}"  
  11. echo "city[15]=${city[15]}"  
  12. echo "city[2]=${city[2]}"    #未初始化數(shù)組的值為空  
  13. echo "city[10]=${city[10]}"  

Shell中允許數(shù)組空缺元素,即可以不連續(xù)地給數(shù)組賦值。還可以用圓括號(hào)將一組值賦給數(shù)組。

  1. #!/bin/bash  
  2.   
  3. city=(Nanjing Beijing Melbourne NewYork)    #圓括號(hào)內(nèi)以空格為分隔符,依次賦給數(shù)組元素  
  4.   
  5. echo "city[0]=${city[0]}"  
  6. echo "city[1]=${city[1]}"  
  7. echo "city[2]=${city[2]}"  
  8. echo "city[3]=${city[3]}"  
  9. echo "city[4]=${city[4]}"       #未被初始化輸出空  
  10. echo "city[5]=${city[5]}"  
  1. #!/bin/bash  
  2.   
  3. city=(Nanjing [10]=Atlanta Massachusetts Marseilles)  #指定所賦元素的標(biāo)號(hào),并以此標(biāo)號(hào)為起點(diǎn)繼續(xù)賦值  
  4.   
  5. echo "city[0]=${city[0]}"       #city[0]=Nanjing  
  6. echo "city[1]=${city[1]}"       #city[1]=  
  7. echo "city[10]=${city[10]}"     #city[10]=Atlanta  
  8. echo "city[11]=${city[11]}"     #city[11]=Massachusetts  
  9. echo "city[12]=${city[12]}"     #city[12]=Marseilles  
  10. echo "city[13]=${city[13]}"     #city[13]=  
既然圓括號(hào)內(nèi)允許對(duì)數(shù)組指定元素進(jìn)行賦值,那么完全可以按照任意順序指定任意元素對(duì)數(shù)組賦值。例如:

  1. city=([2]=Nanjing [10]=Atlanta [1]=Massachusetts [5]=Marseilles)  
(2)位置參數(shù)中$@和$*都表示傳遞到腳本的所有參數(shù),在數(shù)組中@和*的應(yīng)用是打印數(shù)組的所有元素。

  1. #!/bin/bash  
  2.   
  3. city=(Nanjing Beijing Melbourne NewYork)  
  4.   
  5. for i in ${city[@]}  #等價(jià)于  for i in ${city[*]}  
  6. do                   #打印數(shù)組的所有元素  
  7. echo $i  
  8. done  
  1. #!/bin/bash  
  2.   
  3. city[1]="Hong Kong"       #用引號(hào)包含空格的字符串  
  4. city[100]=Massachusetts  
  5. city[101]="New York"  
  6. city[10000]=Atlanta  
  7.   
  8. for i in "${city[@]}"  
  9. do  
  10. echo $i  
  11. done  
      由于city數(shù)組元素包含了空格,因此需要使用引號(hào)將${city[@]}引起來,for循環(huán)和@只打印被賦值的元素而不打印未賦值的元素。

      注意:"${city[@]}"將數(shù)組的所有元素分行打印,而"${city[*]}"只能將數(shù)組的所有元素打印在一行內(nèi)且中間以IFS分隔。不用引號(hào)時(shí)${city[@]}和${city[*]}是等價(jià)的,使用引號(hào)時(shí),@和*只是打印數(shù)組的方式存在差異。
(3)數(shù)組的用法

       數(shù)組的字符串操作與字符串操作的符號(hào)和意義完全一致,數(shù)組字符串操作特殊之處在于所有的操作都是針對(duì)所有的數(shù)組元素逐個(gè)進(jìn)行的。

  1. #數(shù)組的字符串操作  
  2. #!/bin/bash  
  3.   
  4. city=(Nanjing Atlanta Massachusetts MaseillesMas)  
  5.   
  6. echo "Extracting Substring"  #抽取字串  
  7. echo ${city[*]:0}            #抽取整個(gè)數(shù)組  Nanjing Atlanta Massachusetts Marseilles  
  8. echo ${city[*]:1}            #抽取從第1個(gè)元素到結(jié)束的數(shù)組  Atlanta Massachusetts Marseilles  
  9. echo ${city[*]:3}            #抽取從第3個(gè)元素到結(jié)束的數(shù)組  Marseilles  
  10. echo ${city[*]:0:2}          #抽取從第0個(gè)元素開始的兩個(gè)元素  Nanjing Atlanta  
  11. echo  
  12. echo "Removing Substring"    #刪除字串  
  13. echo ${city[*]#M*a}          #刪除匹配M*a的最短字串  Nanjing Atlanta ssachusetts rseilles  
  14. echo ${city[*]##M*a}         #刪除匹配M*a的最長(zhǎng)字串  Nanjing Atlanta chusetts rseilles  
  15. echo  
  16. echo "Replcing Substring"    #替換子串功能  
  17. echo ${city[*]/M*s/Year}     #替換第1次與M*a匹配的子串  Nanjing Atlanta Year Year  
  18. echo ${city[*]//Mas/Year}    #替換所有與Mas匹配的子串   Nanjing Atlanta Yearsachusetts YeareillesYear  
  19.                              #替換的正則為最長(zhǎng)匹配  
      數(shù)組也可以存放read命令所讀入的用戶輸入?yún)?shù),declare -a city(并不是必須的)將city申明為數(shù)組,用read -a city命令將輸入存儲(chǔ)到city數(shù)組之中,輸入以空格分開??梢允褂胾nset city[0]命令清空一個(gè)元素,和unset city清空整個(gè)數(shù)組。使用${#city[@]}獲取數(shù)組的長(zhǎng)度。

      shell數(shù)組的一種重要操作:數(shù)組連接。

  1. #!/bin/bash  
  2.   
  3. city=(Beijing Nanjing Shanghai)  
  4. person=(Cai [5]=Wu Tang)             #數(shù)組不連續(xù)地賦值  
  5.   
  6. declare -a combine                   #聲明combine數(shù)組  
  7. combine=(${city[@]} ${person[@]})    #combine是數(shù)組city和person的連接,連接操作將不連續(xù)的元素按序存放到combine數(shù)組中  
  8.   
  9. element_count=${#combine[@]}         #while循環(huán)輸出combine數(shù)組  
  10. index=0  
  11. while [ "$index" -lt "$element_count" ]  
  12. do  
  13.    echo "Element[$index]=${combine[$index]}"  #數(shù)組標(biāo)號(hào)與值的對(duì)應(yīng)關(guān)系  
  14.    let "index=$index+1"  
  15. done  
  16. ###################  
  17. echo  
  18. unset combine                                 #清空combine數(shù)組  
  19. combine[0]=${city[@]}                         #將city數(shù)組賦給combine[0]的一個(gè)元素  
  20. combine[1]=${person[@]}                       #將person數(shù)組賦給combine[1]的一個(gè)元素  
  21. element_count=${#combine[@]}  
  22. index=0  
  23. while [ "$index" -lt "$element_count" ]  
  24. do  
  25.    echo "Element[$index]=${combine[$index]}"  
  26.    let "index=$index+1"  
  27. done  
  28. ###################  
  29. echo  
  30. declare -a subcombine=${combine[1]}          #聲明數(shù)組時(shí)賦值  
  31. element_count=${#subcombine[@]}  
  32. index=0  
  33. while [ "$index" -lt "$element_count" ]  
  34. do  
  35.    echo "Element[$index]=${subcombine[$index]}"  
  36.    let "index=$index+1"  
  37. done  

(4)數(shù)組實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)

      數(shù)據(jù)結(jié)構(gòu)是指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合,它直接影響到程序的運(yùn)行速度和存儲(chǔ)效率。Shell不直接支持如堆棧、隊(duì)列、鏈表等數(shù)據(jù)結(jié)構(gòu),但可以很容易實(shí)現(xiàn)線性數(shù)據(jù)結(jié)構(gòu)。對(duì)于樹形、圖等復(fù)雜的數(shù)據(jù)結(jié)構(gòu),shell理論上可以實(shí)現(xiàn),但難度角度。

      利用數(shù)組實(shí)現(xiàn)堆棧操作。push函數(shù)將字符串壓入堆棧,pop函數(shù)能彈出棧頂元素,status函數(shù)打印當(dāng)前堆棧的狀態(tài)信息。其中shift命令完成兩個(gè)功能:第一,所有位置參數(shù)左移1位,即$2移動(dòng)到$1的位置,$3移動(dòng)到$2的位置,依次類推($0不變);第二,$#變量值減1。

  1. #!/bin/bash  
  2.   
  3. MAXTOP=50               #堆棧能存放元素的最大值  
  4.   
  5. TOP=$MAXTOP             #棧頂指針,初始值是$MAXTOP  
  6.   
  7. TEMP=  
  8. declare -a STACK        #全局?jǐn)?shù)組STACK  
  9.   
  10. push()                  #push進(jìn)棧操作,可同時(shí)將多個(gè)元素壓入堆棧  
  11. {  
  12.         if [ -z "$1" ]      #無參數(shù),返回  
  13.         then  
  14.              return  
  15.         fi  
  16.   
  17.         #for ((i=1; i<=$#; i++))  
  18.         until [ $# -eq 0 ]   #until循環(huán)將push函數(shù)的所有參數(shù)都?jí)喝攵褩?nbsp; 
  19.         do  
  20.                 let TOP=TOP-1    #棧頂指針減1  
  21.   
  22.                 STACK[$TOP]=$1  
  23.                 shift            #腳本參數(shù)除$0外左移1位,$#參數(shù)總個(gè)數(shù)減1  
  24.         done  
  25.   
  26.         return  
  27. }  
  28.   
  29. pop()                     #pop出棧操作,執(zhí)行pop函數(shù)使棧頂元素出棧  
  30. {  
  31.         TEMP=  
  32.   
  33.         if [ "$TOP" -eq "$MAXTOP" ]   #若堆棧為空,返回  
  34.         then  
  35.          return  
  36.         fi  
  37.   
  38.         TEMP=${STACK[$TOP]}           #棧頂元素出棧  
  39.         unset STACK[$TOP]           
  40.         let TOP=TOP+1                 #棧頂指針加1  
  41.         return  
  42. }  
  43.   
  44. status()                          #顯示當(dāng)前堆棧內(nèi)的元素,以及TOP指針和TEMP變量  
  45. {  
  46.         echo "==========STACK=========="  
  47.         for i in ${STACK[@]}                                  
  48.         do  
  49.         echo $i  
  50.         done  
  51.         echo "Stack Pointer=$TOP"  
  52.         echo "Just popped \""$TEMP"\" off the stack"  
  53.         echo "=========================="  
  54. }  
  55.   
  56. push one              #1個(gè)元素入棧  
  57. status                #顯示狀態(tài)  
  58. push two three four   #3個(gè)元素入棧  
  59. status  
  60.   
  61. pop                   #出棧  
  62. pop  
  63. status  
  64. push five six  
  65. status  

     利用一維數(shù)組模擬實(shí)現(xiàn)二維數(shù)組,二維數(shù)組仍存儲(chǔ)在一維數(shù)組中,只是通過行號(hào)和列號(hào)計(jì)算出數(shù)組的索引而已??梢圆捎迷摲椒ㄊ箂hell腳本語言用于定義二維數(shù)組和矩陣。

  1. #創(chuàng)建一個(gè)二維數(shù)組,并以逐行打印及旋轉(zhuǎn)45度打印的兩種方式將它打印出來  
  2. #!/bin/bash  
  3.   
  4. #定義行數(shù)、列數(shù),及數(shù)組名  
  5. ROW=5  
  6. COL=5  
  7. declare -a MATRIX      #申明MATRIX數(shù)組  
  8.    
  9. load_alpha ()  
  10. {  
  11.         local rc=0  
  12.         local index  
  13.           
  14.         #for循環(huán)將A-Y這25個(gè)字符存儲(chǔ)到MATRIX數(shù)組  
  15.         for i in A B C D E F G H I J K L M N O P Q R S T U V W X Y  
  16.         do  
  17.                 local row=`expr $rc / $COL`  
  18.                 local column=`expr $rc % $ROW`  
  19.                 let "index = $row * $ROW + $column"  
  20.                 MATRIX[$index]=$i  
  21.                 let "rc += 1"  
  22.         done    
  23. }  
  24.     
  25. print_alpha ()  
  26. {  
  27.         local row=0  
  28.         local index  
  29.           
  30.         #逐行打印MATRIX數(shù)組  
  31.         while [ "$row" -lt "$ROW" ]   
  32.         do                             
  33.                 local column=0  
  34.                 echo -n "       "   
  35.                 while [ "$column" -lt "$COL" ]  
  36.                 do  
  37.                         let "index = $row * $ROW + $column"  
  38.                         echo -n "${MATRIX[index]} "   
  39.                         let "column += 1"  
  40.                 done  
  41.                 let "row += 1"  
  42.                 echo  
  43.         done  
  44.       echo  
  45. }  
  46.     
  47. filter ()     # 過濾掉負(fù)的數(shù)組下標(biāo).   
  48. {  
  49.         echo -n "  "  # 產(chǎn)生傾斜.   
  50.                       # 解釋一下, 這是怎么做到的.   
  51.           
  52.         if [[ "$1" -ge 0 &&  "$1" -lt "$ROW" && "$2" -ge 0 && "$2" -lt "$COL" ]]  
  53.         then  
  54.             let "index = $1 * $ROW + $2"  
  55.             # 現(xiàn)在, 按照旋轉(zhuǎn)方向進(jìn)行打印.   
  56.             echo -n " ${MATRIX[index]}"  
  57.             # alpha[$row][$column]  
  58.         fi      
  59. }  
  60.    
  61. rotate ()  # 將數(shù)組旋轉(zhuǎn)45度 --  
  62. {          #+ 從左下角進(jìn)行"平衡".   
  63.         local row  
  64.         local column  
  65.           
  66.         for (( row = ROW; row > -ROW; row-- ))  
  67.           do    
  68.           for (( column = 0; column < COL; column++ ))  
  69.           do  
  70.                   if [ "$row" -ge 0 ]  
  71.                   then  
  72.                     let "t1 = $column - $row"  
  73.                     let "t2 = $column"  
  74.                   else  
  75.                     let "t1 = $column"  
  76.                     let "t2 = $column + $row"  
  77.                   fi    
  78.                   filter $t1 $t2   # 將負(fù)的數(shù)組下標(biāo)過濾出來  
  79.          done  
  80.        
  81.         echo; echo  
  82.         done   
  83. }  
  84.    
  85.  #下面利用上述函數(shù)創(chuàng)建二維數(shù)組,逐行和旋轉(zhuǎn)45°打印數(shù)組  
  86.  load_alpha     # 加載數(shù)組  
  87.  print_alpha    # 打印數(shù)組  
  88.  rotate         # 逆時(shí)針旋轉(zhuǎn)45°打印  

三、總結(jié)

(1)別名、列表及數(shù)組這三個(gè)知識(shí)點(diǎn)是相對(duì)獨(dú)立的,可分開理解。

(2)數(shù)組是重點(diǎn),會(huì)使用數(shù)組字符串的操作,以及利用數(shù)組實(shí)現(xiàn)堆棧和二維數(shù)組等數(shù)據(jù)結(jié)構(gòu)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    国产精品人妻熟女毛片av久 | 色鬼综合久久鬼色88| 久久国产亚洲精品成人| 懂色一区二区三区四区| 欧美精品亚洲精品日韩专区| 一区二区三区国产日韩| 超薄丝袜足一区二区三区| 好吊日视频这里都是精品| 亚洲精品国产主播一区| 欧美日韩人妻中文一区二区 | 东京热男人的天堂一二三区| 亚洲中文字幕一区三区| 色婷婷亚洲精品综合网| 国产成人精品国产成人亚洲| 亚洲精品成人综合色在线| 日韩免费成人福利在线| 久草精品视频精品视频精品| 国产精品日韩欧美一区二区| 国产av精品高清一区二区三区| 国产精品十八禁亚洲黄污免费观看| 成人精品网一区二区三区| 人妻少妇av中文字幕乱码高清| 黑鬼糟蹋少妇资源在线观看| 精品国产一区二区欧美| 国产日韩欧美在线亚洲| 日韩欧美一区二区黄色| 国产精品成人免费精品自在线观看 | 麻豆国产精品一区二区三区| 欧美日韩国产的另类视频| 日韩美女偷拍视频久久| 国产日本欧美韩国在线| a久久天堂国产毛片精品| 正在播放玩弄漂亮少妇高潮| 91偷拍视频久久精品| 丝袜诱惑一区二区三区| 一区二区免费视频中文乱码国产| 久久久精品区二区三区| 大香蕉大香蕉手机在线视频| 91午夜少妇极品福利| 免费人妻精品一区二区三区久久久| 手机在线观看亚洲中文字幕|