數組詳解

數組

變量:存儲單個元素的內存空間
數組:存儲多個元素的連續的內存空間,相當于多個變量的集合
    
    數組名:整個數組只有一個名字
    數組索引:編號從0開始,屬于數值索引
        數組名[索引],
        ${ARRAY_NAME[INDEX]}
    
    要注意的是bash-4以及之后的版本支持自定義索引格式,而不僅僅是0,1,2,3...數字格式
        此類數組稱之為”關聯數組“

聲明數組:

declare -a NAME?。郝暶魉饕龜到M    declare -A NAME  :聲明關聯數組
        關聯數組必須先聲明后使用

數組中元素的賦值方式:

(1)一次只賦值一個元素        
    ARRAY_NAME[INDEX]=VALUE
            [root@localhost fun]# tianshi[0]="datianshi"
            [root@localhost fun]# tianshi[1]="xiaotianshi"
            [root@localhost fun]# tianshi[2]="heitianshi"

(2)一次賦值全部元素        
    ARRAY_NAME=(“VAL1“ ”VAL2“ ”VAL3“...)
           (1) [root@localhost fun]# tianshi=("datianshi" "xiaotianshi" "heitianshi")
           (2)[root@localhost fun]# file=(/root/*)
           (3) [root@localhost fun]# file=(`ls /root/`) 
                

(3)只賦值特定元素        
    ARRAY_NAME=([0]="val1" [3]="val4"...)
            [root@localhost fun]# tianshi=([0]="datianshi" [2]="heitianshi")
        注意:bash支持稀疏格式的數組
(4)read -a ARRAY_NAME
            [root@localhost fun]# read -a tianshi
            datianshi heitianshi xiaotianshi
            [root@localhost fun]# echo ${tianshi[*]}
            datianshi heitianshi xiaotianshi

數組引用

引用數組中的元素:
    ${ARRAY_NAME[INDEx]}
    注意:引用時,只給數組名,表示引用下標為0的元素。   
    ${ARRAY_NAME[*]}:引用數組中的所有元素    
    ${ARRAY_NAME[@]}:引用數組中的所有元素
數組的長度(數組中元素的個數):    
    ${#ARRAY_NAME[*]}
    ${#ARRAY_NAME[@]}
        [root@localhost ~]# haochide[0]=baozi
        [root@localhost ~]# haochide[1]=hongshaorou
        [root@localhost ~]# haochide[2]=gongbaojiding
        [root@localhost ~]# haochide[3]=jiangzhouzi
        [root@localhost ~]# echo ${#haochide[@]}
        4
        [root@localhost ~]# echo ${#haochide[*]}
        4

數組元素切片:

${ARRAY_NAME[@]:offset:number}        
        offset:要跳過的元素個數        
        number:要取出的元素個數
            省略number的話是表示偏移量之后的所有元素
        [root@localhost ~]# echo ${haochide[@]:1:2}
        hongshaorou gongbaojiding
        [root@localhost ~]# echo ${haochide[@]:1}
        hongshaorou gongbaojiding jiangzhouzi
向非稀疏數組中追加元素:
    ARRAY_NAME[${#ARRAY_NAME[*]}]=VALUE
    刪除數組中的元素:
    unset ARRAY[INDEx]
        [root@localhost ~]# unset haochide[3]
        [root@localhost ~]# echo ${haochide[3]}
        
        [root@localhost ~]# echo ${haochide[2]}
        gongbaojiding
        [root@localhost ~]#
關聯數組:
    declare -A ARRAY_NAME
        ARRAY_NAME=([index_name1]="value1" [index_name2]="value2"...)

bash的內置字符串處理工具:

${#var}:返回字符串變量var的長度
        
        [root@localhost ~]# echo ${var[*]}
        abcdefghijklmnopqrstuvwxyz
        [root@localhost ~]# echo ${#var}
        26

字符串切片:

${var:offset:number}
            取字符串的子串
                [root@localhost ~]# echo ${var:3:5}
                defgh

            取字符的最右側的幾個字符:${var: -length}::冒號后面跟一個空格
                [root@localhost ~]# echo ${var: -5}
                vwxyz
            兩個結合使用的話就是跳過offset所包括的字符,到去掉-length的字符
                [root@localhost ~]# echo ${var:5: -5}
                fghijklmnopqrstu

基于模式取字符串:

${var#*word}:其中Word是指定的分隔符:
        功能:自左而右,查找var變量所存儲的字符串中,第一次出現的Word分隔符,刪除字符串開頭至此分隔符之間的所有字符;
            [root@localhost ~]# echo ${var#*h}
            ijklmnopqrstuvwxyz

${var##*word}:其中Word是指定的分隔符:
        功能:自左而右,查找var變量所存儲的字符串中,最后一次出現的Word分隔符,刪除字符串開頭至此分隔符之間的所有字符;
        [root@localhost ~]# echo $var
        abcdefgfggggggfadvk
        [root@localhost ~]# echo ${var##*f}
        advk
        
        可以用這個方法取基名:
            [root@localhost ~]# file="/etc/init.d/functions"
            [root@localhost ~]# echo ${file##*/}
            functions
${var%word*}:其中Word是指定的分隔符:
        功能:自右而左,查找var變量所存儲的字符串中,第一次出現的Word分隔符,刪除字符串尾部至此分隔符之間的所有字符;
    
${var%word*}:其中Word是指定的分隔符:
        功能:自右而左,查找var變量所存儲的字符串中,最后一次出現的Word分隔符,刪除字符串尾部至此分隔符之間的所有字符;

查找替換:

${var/PATTERN/SUBSTI}:查找var所表示的字符串中,第一次被PATTERN所匹配到的字符串,將其替換為SUBSTI所表示的字符串;
        
        [root@localhost ~]# echo $mantou
        maozidacongyoumodacongdoubanjiangdacong
        [root@localhost ~]# echo ${mantou/dacong/yangcong}
        maoziyangcongyoumodacongdoubanjiangdacong

${var//PATTERN/SUBSTI}:查找var所表示的字符串中,所有被PATTERN所匹配到的字符串,將其全部替換為SUBSTI所表示的字符串;
   
    [root@localhost ~]# echo $mantou
    maozidacongyoumodacongdoubanjiangdacong
    [root@localhost ~]# echo ${mantou//dacong/yangcong}
    maoziyangcongyoumoyangcongdoubanjiangyangcong

${var/#PATTERN/SUBSTI}:查找var所表示的字符串中,行首被PATTERN所匹配到的字符串,將其替換為SUBSTI所表示的字符串;
    
    [root@localhost ~]# echo ${mantou/#maozi/baozi}
    baozidacongyoumodacongdoubanjiangdacong

${var/%PATTERN/SUBSTI}:查找var所表示的字符串中,行尾被PATTERN所匹配到的字符串,將其替換為SUBSTI所表示的字符串;
    
    [root@localhost ~]# echo ${mantou/%dacong/dasuan}
    maozidacongyoumodacongdoubanjiangdasuan

注意:PATTERN中使用glob風格的通配符

    [root@localhost ~]# echo ${mantou/maozi*youmo/dasuan}
    dasuandacongdoubanjiangdacong
        
    查找刪除:
        ${var/PATTERN}::以PATTERN為模式查找var字符串中第一次匹配到的字符,并刪除;
        ${var//PATTERN}:以PATTERN為模式查找var字符串中所有匹配到的字符,并刪除;
        ${var/#PATTERN}
        ${var/%PATTERN}
        
    字符大小寫轉換:
        ${var^^}:把var中的所有小寫字符轉換為大寫;
        ${var,,}:把var中的所有大寫字符轉換為小寫;
        
        
    變量賦值:
        ${var:-VALUE}:如果變量var為空或未設置,那么返回value;否則返回var變量的值;
        ${var:=VALUE}:如果變量var為空或未設置,那么返回value,并將VALUE賦給var;否則返回var變量的值;
        ${var:+VALUE}:如果var變量不空,則返回value;
        ${var:?ERROR_INFO}:如果var為空,或未設定,那么返回ERROR_INFO為錯誤提示;否則,返回var值;

高級變量用法-有類型變量

Shell 變量一般是無類型的,但是bash Shell 提供了declare和typeset兩個命令用于指定變量的類型,兩個命令是完全等價的

 declare [ 選項]  變量名
    -r  將變量設置為只讀屬性    -i  將變量定義為整型數    -a  將變量定義為數組    -f  顯示此腳本前定義過的所有函數名及其內容    -F  僅顯示此腳本前定義過的所有函數名    -x  將變量聲明為環境變量    -l 將變量值轉為小寫字母    -u 將變量值轉為大寫字母

間接變量引用

如果第一個變量的值是第二個變量的名字,從第一個變量引用第二個變量的值就稱為間接變量引用
variable1=variable2
variable2=value
variable1的值是variable2,而variable2又是變量名,
variable2的值為value,間接變量引用是指通過variable1獲得變量值value的行為

bash Shell 提供了兩種格式實現間接變量引用    eval tempvar=\$$variable1
    tempvar=${!variable1}
    
示例:
    [root@localhost tmp]# v1=v2
    [root@localhost tmp]# v2=nihaoa
    [root@localhost tmp]# eval v3=\$$v1
    [root@localhost tmp]# echo $v3
    nihaoa
    [root@localhost tmp]# echo ${!v1}
    nihaoa

eval 命令

eval 命令將會首先掃描命令行中所有的變量然后進行所有變量的置換,然后再執行該命令。該命令適用于那些一次掃描無法實現其功能的變量。該命令對變量進行兩次掃描。

  示例:
    [root@localhost tmp]# a=whoami
    [root@localhost tmp]# echo $a
    whoami
    [root@localhost tmp]# `echo $a`
    root
    [root@localhost tmp]# eval $a
    root

創建臨時文件

mktemp命令:
    創建的臨時文件可避免沖突

mktemp [OPTION]... [TEMPLATE]
    TEMPLATE: filename.XXX
    X 至少要出現三個
    
OPTION: :
    -d:  創建臨時目錄
    -p DIR或--tmpdir=DIR:指明臨時文件所存放目錄位置
   
示 例 :    
    #mktemp /tmp/test.XXX
    #tmpdir=`mktemp –d /tmp/testdir.XXX`    
    #mktemp --tmpdir=/testdir test.XXXXXX

安裝復制文件

install 命令:    
    install [OPTION]... [-T] SOURCE DEST 單文件    
    install [OPTION]... SOURCE... DIRECTORY
    install [OPTION]... -t DIRECTORY SOURCE...    
    install [OPTION]... -d DIRECTORY...創建空目錄
    
選項:
    -m MODE ,默認755
    -o OWNER
    -g GROUP

bash 如何展開命令行

把命令行分成單個命令詞
展開別名
展開大括號種的聲明({}) )
展開波浪符聲明(~) )
命令替換$() 和 ``) )
再次把命令行分成命令詞
展開文件通配(* 、? 、[abc] 等等)
準備I/0 重導向(< 、>) )
運行命令



反斜線(\ )會使隨后的字符按原意解釋
    $ echo Your cost: \$5.00
    Your cost: $5.00加引號來防止擴展
    ?  單引號(’ )防止所有擴展
    ?  雙引號(”)也防止所有擴展,但是以下情況例外:
    $ (美元符號) - 變量擴展
    ` (反引號) - 命令替換
    \ (反斜線) - 禁止單個字符擴展
    ! (嘆號) - 歷史命令替換
    
  作業:
      輸入若干個數值存入數組中,采用冒泡算法進行升序或降序排序

1 (1).jpg

1 (2).jpg

運行后結果是:

1 (3).jpg

原創文章,作者:dxkboke,如若轉載,請注明出處:http://www.www58058.com/39703

(1)
dxkbokedxkboke
上一篇 2016-08-24
下一篇 2016-08-24

相關推薦

  • 難搞的grep、find練習題

    馬哥教育網絡班21期-第五周博客作業 1、顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行; [root@caicai ~]# grep –color "^[[:space:]]\+" /boot/grub/grub.conf    …

    Linux干貨 2016-07-26
  • linux運維

    linux運維大綱,學習路線圖

    Linux干貨 2017-10-21
  • sed和awk和數組實踐-week15

    1、總結sed和awk的詳細用法; (1) sedsed:Stream EDitor,流編輯器,行編輯器 基本原理:一次從文本中讀取一行,放到sed自己的工作車間加工, 該工作車間叫做模式空間(pattern space)判斷該行是否符合過濾模式, 如果符合過濾模式: 送往標準輸出(終端) 執行編輯操作, 從模式空間中處理以后,處理過后送到標準輸出(不一定有…

    Linux干貨 2017-05-06
  • N22-第六周作業

    vim小小的總結 (本總結摘自馬哥網絡班22期課堂筆記) vim是一款交互式的全屏編輯器,是vi的升級版,在vi上增強了很多,如:多級撤銷,多窗口和多緩沖區,語法高亮,在線幫助等。 vim也是一種模式化的編輯器。分別是編輯模式也叫命令模式,輸入模式,末行模式。其中使用vim打開文件后默認的是編輯模式。 三種模式之間的轉換: 編輯模式—>輸入模式 &…

    Linux干貨 2016-11-21
  • N26-博客作業-week10

    1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情) 2、為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區;  (1) 為硬盤新建兩個主分區;并為其安裝grub;  (2) 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs;  (3) 為rootfs提供bas…

    2017-04-09
  • N21沉舟13周作業

    1、建立samba共享,共享目錄為/data,要求:(描述完整的過程)   1)共享名為shared,工作組為magedu;   2)添加組develop,添加用戶gentoo,centos和ubuntu,其中gentoo和centos以develop為附加組,ubuntu不屬于develop組;密碼均為用戶名;   3)添加s…

    Linux干貨 2016-10-24
欧美性久久久久