bash腳本編程之數組、高級字符串處理、高級變量操作、用戶環境配置

概述:

    承接之前腳本編程部分,本篇將介紹一下腳本編程基礎語法的最后一部分內容,具體分為:

        1、數組簡介

        2、高級字符串處理

        3、高級變量操作

        4、用戶環境配置

        5、數組實例演示

第一章    數組簡介

    1、數組的相關概念

        數組:一種數據結構,存儲多個元素的連續的內存空間,相當于多個變量的集合,可以使用索引獲取相關元素

        數組名和索引

            索引:編號從0開始,屬于數值索引

            注意:索引可支持使用自定義的格式,而不僅是數值格式,即為關聯索引, bash4.0版本之后開始支持。bash的數組支持稀疏格式(索引不連續)

    2、數組的定義

        declare -a ARRAY_NAME   聲明為普通數組,可以不用事先定義,直接使用

        declare -A ARRAY_NAME   聲明為關聯數組,關聯數組必須先申明后使用

    3、數組元素的賦值:

        <1>一次只賦值一個元素;ARRAY_NAME[INDEX]=VALUE

            weekdays[0]="Sunday"

            weekdays[4]="Thursday"

        <2> 一次賦值全部元素:(支持類似for中列表的賦值方式)

            ARRAY_NAME=("VAL1" "VAL2" "VAL3" …)

            如:

                aa=(/boot/*)

                aa=(`ls /root`)

                aa=({1..9})

                aa=({1,2}.{a,b})  此時數組中是1.a  1.b  2.a  2.b

            blob.png

        <3> 只賦值特定元素:ARRAY_NAME=([0]="VAL1" [3]="VAL2" …)

                如:color=(‘red’ ‘blue’ [6]=‘green’)

                此時color[0]值為red、color[1]值為blue、color[2]到color[5]值為空,color[6]值為green

        <4> 交互式數組值對賦值   read -a ARRAY_NAME

    4、數組引用

        引用數組中某元素的值: ${ARRAY_NAME[INDEX]}

            注意:省略[INDEX]表示引用下標為0的元素

        數組的長度(數組中元素的個數):

            ${#ARRAY_NAME[*]}

            ${#ARRAY_NAME[@]}

        數組的中某個元素的字符長度:

            ${#ARR_NAME[INDEX]}

        引用數組中的元素:

            所有元素: ${ARRAY[@]}, ${ARRAY[*]}

        數組切片: ${ARRAY[@]:offset:number}

            offset: 要跳過的元素個數

            number: 要取出的元素個數

        取偏移量之后的所有元素

            ${ARRAY[@]:offset}

        blob.png

    5、向數組中追加元素:(放到數組最后一個)

        ARRAY[${#ARRAY[*]}]

        blob.png

  

    6、刪除數組中的某元素:導致稀疏格式

        unset ARRAY[INDEX]

        blob.png

    7、關聯數組:declare -A ARRAY_NAME

        blob.png

第二章    高級字符串處理

    1、字符串切片:

        ${#var}:返回字符串變量var的長度

            如:

                aa=abcdefg

                echo ${#aa} 結果為7

        ${var:offset}:返回字符串變量var中從第offset個字符后(不包括第offset個字符)的字符開始,到最后的部分,offset的取值在0 到 ${#var}-1 之間

            如:

                aa=abcdefg

                echo ${aa:3} 結果為defg

        ${var:offset:number}:返回字符串變量var中從第offset個字符后(不包括第offset個字符)的字符開始,長度為number的部分

            如:

                aa=abcdefg

                echo ${aa:3:2} 結果為de

        ${var: -lengh}:取字符串的最右側幾個字符:注意:冒號后必須有一空白字符

            如:

                aa=abcdefg

                echo ${aa: -3} 結果為efg

                echo ${aa:2: -1} 結果為 cdef

        blob.png

    2、基于模式取子串:

        ${var#*word}:其中word可以是指定的任意字符

        功能:自左而右,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串開頭至第一次出現word字符之間的所有字符

            如:

                aa=abcdefgabcdefgabcdefg

                echo ${aa#*de} 結果為fgabcdefgabcdefg

        ${var##*word}:同上,不同的是,刪除的是字符串開頭至最后一次由word指定的字符之間的所有內容

            如:

                aa=abcdefgabcdefgabcdefg

                echo ${aa##*de} 結果為fg

            如:

                file="/var/log/messages"

                echo ${file##*/} 結果為 messages

        ${var%word*}:其中word可以是指定的任意字符;

        功能:自右而左,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串最后一個字符向左至第一次出現word字符之間的所有字符;

            如:

                aa=abcdefgabcdefgabcdefg

                echo ${aa%de*} 結果為 abcdefgabcdefgabc

            如:

                file="/var/log/messages"

                echo ${file%/*} 結果為 /var/log

        ${var%%word*}:同上,只不過刪除字符串最右側的字符向左至最后一次出現word字符之間的所有字符;

            如:

                aa=abcdefgabcdefgabcdefg

                echo ${aa%%de*} 結果為 abc

        blob.png

        blob.png

    3、查找替換:

        ${var/pattern/substi}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substi替換之

            如:

                aa=abcdefgabcdefgabcdefg

                echo ${aa/de/DE}  結果為 abcDEfgabcdefgabcdefg

        ${var//pattern/substi}: 查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substi替換之

            如:

                aa=abcdefgabcdefgabcdefg

                echo ${aa//de/DE}  結果為 abcDEfgabcDEfgabcDEfg

        ${var/#pattern/substi}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substi替換之

            如: 

                aa=abcdefgabcdefgabcdefg

                echo ${aa/#abcde/DE}  結果為 DEfgabcDEfgabcDEfg

        ${var/%pattern/substi}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substi替換之

            如: 

                aa=abcdefgabcdefgabcdefg

                echo ${aa/%efg/DE}  結果為 abcdefgabcdefgabcdDE

        blob.png

    4、查找并刪除:

        ${var/pattern}:查找var所表示的字符串中,刪除第一次被pattern所匹配到的字符串

            如: 

                aa=abcdefgabcdefgabcdefg

                echo ${aa/de}  結果為 abcfgabcdefgabcdefg

        ${var//pattern}:查找var所表示的字符串中,刪除所有被pattern所匹配到的字符串

            如: 

                aa=abcdefgabcdefgabcdefg

                echo ${aa//de}  結果為 abcfgabcfgabcfg

        ${var/#pattern}:查找var所表示的字符串,刪除行首所匹配到的字符串

            如: 

                aa=abcdefgabcdefgabcdefg

                echo ${aa/#abc}  結果為 defgabcdefgabcdefg

        ${var/%pattern}:查找var所表示的字符串,刪除行尾所匹配到的字符串

            如: 

                aa=abcdefgabcdefgabcdefg

                echo ${aa/%efg}  結果為 abcdefgabcdefgabcd

        blob.png

    5、字符大小寫轉換:

        ${var^^}:把var中的所有小寫字母轉換為大寫

            如: 

                aa=abCDEFGABcdEFGABCDefG

                echo ${aa^^}  結果為 ABCDEFGABCDEFGABCDEFG

        ${var,,}:把var中的所有大寫字母轉換為小寫

            如:

                aa=abCDEFGABcdEFGABCDefG

                echo ${aa,,} 結果為 abcdefgabcdefgabcdefg

        blob.png

第三章    高級變量操作

    1、高級變量賦值:

        ${var:-value}

        功能:如果var為空或未設置,那么返回value,但是不會把值賦給var;否則,則返回var的值

            如:echo ${aa:-abcd}  結果為 abcd 此時 echo $aa  結果是空

                aa=1234;echo ${aa:-abcd} 結果為 1234

       blob.png 

        ${var:+value}

        功能:如果var不空,則返回value;也不會把值賦給var

            如:echo ${aa:+abcd} 結果為空

                aa=1234;echo ${aa:+abcd} 結果為 abcd

        blob.png

        ${var:=value}

        功能:如果var為空或未設置,那么返回value,并將value賦值給var;否則,則返回var的值

            如:echo ${aa:=abcd} 結果為 abcd 此時 echo $aa 結果為abcd

                aa=1234;echo ${aa:=bacd} 結果為 1234 此時 echo $aa 結果為1234

        blob.png

        ${var:?error_info}

        功能:如果var為空或未設置,那么返回error_info;否則,則返回var的值

            如: echo ${aa:?"cuo wu"} 結果為 -bash: aa: cuo wu

                此時echo $aa 結果為空

                aa=1234 ; echo ${aa:?"cuo wu"} 結果為 1234

        blob.png

    2、為腳本程序使用配置文件,實現變量賦值

        <1>定義文本文件,每行定義“ name=value”

        <2> 在腳本中source此文件即可

        blob.png

    3、間接變量引用:

        如果第一個變量的值是第二個變量的名字,從第一個變量引用第二個變量的值就稱為間接變量引用

        variable1=variable2

        variable2=value

        variable1的值是variable2,而variable2又是變量名,variable2的值為value,間接變量引用是指通過variable1獲得變量值value的行為

        間接變量引用的定義方式:

        方式一:eval VAR2=\$$VAR1

        方式二:VAR2=${!VAR1}

            如:

        blob.png

        blob.png

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

        blob.png

    4、利用declare命令,定義有型變量:

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

        命令語法:declare [選項] 變量名

        常用選項:

            -r 將變量設置為只讀屬性

            -i 將變量定義為整型數

            -a 將變量定義為數組

            -A 將變量定義為關聯數組,注意關聯數組必須要先定義,后使用

            -f 顯示此腳本前定義過的所有函數名及其內容

            -F 僅顯示此腳本前定義過的所有函數名

            -x 將變量聲明為環境變量

            -l 將變量值轉為小寫字母

            -u 將變量值轉為大寫字母

        blob.png

        blob.png    

        blob.png

    5、利用maketemp命令創建臨時文件,可避免腳本中需要創建臨時文件時造成的文件名沖突

        語法格式:mktemp [OPTION]… [TEMPLATE]

            TEMPLATE: filename.XXX    X至少要出現三個

            OPTION:

                -d: 創建臨時目錄

                –tmpdir=/DIR:指明臨時文件所存放的目錄位置,可以在創建的時候直接指定目錄,而不利用–tempdir指定

            實例:

                mktemp –tmpdir=/testdir test.XXXXXX

                mktemp /testdir/file.XXX

        blob.png  

        blob.png

    6、bash展開命令行的優先級

        展開別名

        展開大括號種的聲明{}

        展開波浪符聲明~

        命令替換$() 和 “

        再次把命令行分成命令詞

        展開文件通配 *、 ?、 [abc]等等

        準備I/0重導向<、 >

        運行命令

    7、防止擴展

        反斜線( \)會使隨后的字符按原意解釋

             echo Your cost: \$5.00

                Your cost: $5.00

        加引號來防止擴展

            單引號( ’)防止所有擴展

            雙引號( ”)也防止所有擴展,但是以下情況例外:

                $(美元符號) - 變量擴展

                `(反引號) - 命令替換

                \(反斜線) - 禁止單個字符擴展

                !(嘆號) - 歷史命令替換

第四章    用戶環境配置

    1、bash配置文件的分類

        按生效范圍劃分,存在兩類:
            全局配置:
                /etc/profile
                /etc/profile.d/*.sh
                /etc/bashrc
            個人配置:
                ~/.bash_profile
                ~/.bashrc

    2、shell登錄的兩種方式和及其分別讀取的配置文件

        交互式登錄:
        <1>直接通過終端輸入賬號密碼登錄;
        <2>使用su – USERNAME 切換的用戶
        配置文件執行順序:
        /etc/profile –> /etc/profile.d/*.sh –>~/.bash_profile –> ~/.bashrc –> /etc/bashrc

        非交互式登錄:
        <1>su USERNAME
        <2>圖形界面下打開的終端
        <3>執行腳本
        配置文件執行順序:
        ~/.bashrc –> /etc/bashrc –> /etc/profile.d/*.sh

    3、配置文件的作用

        按功能劃分,存在兩類:profiile類和bashrc類

        profile類:為交互式登錄的shell提供配置
            全局: /etc/profile, /etc/profile.d/*.sh
            個人: ~/.bash_profile
            功用:
                <1> 用于定義環境變量
                <2> 運行命令或腳本

        bashrc類:為非交互式和交互式登錄的shell提供配置
            全局: /etc/bashrc
            個人: ~/.bashrc
            功用:
                <1> 定義命令別名和函數
                <2> 定義本地變量

        修改profile和bashrc文件后需生效
            兩種方法:
                <1>重新啟動shell進程
                <2> . /PATH/TO/FILENAME 或source /PATH/TO/FILENAME
            例:
                .  ~/.bashrc

    4、退出登錄的shell時執行任務的配置文件,保存在~/.bash_logout文件中

        用途:
            退出時自動創建備份
            退出時清除臨時文件

第五章    數組實例演示

    1、輸入若干個數值存入數組中,采用冒泡算法進行升序或降序排序

    #!/bin/bash    
    # Autor: nwc
    # Version: 2.0
    # CreateTime: 2016-08-23
    # Description: 
    
    read -p "input how much numbers you want to create: " NUM 
    
    if expr $NUM + 0 &>/dev/null && [ $NUM -ge 1 ] ; then
            for i in `seq 1 $NUM`;do
                    num[$i]=$RANDOM
            done
    else
            echo "bad input"
            exit 88
    fi
    
    echo -e "random numbers is:\n${num[@]}"
    
    n=${#num[@]}
    until [ $n -lt 1 ];do   
            for j in `seq 1 $n`;do
                    [ $j -lt $n ] && k=$[$j+1] || k=$n
                    if [ ${num[$j]} -gt ${num[$k]} ] ; then
                            mid=${num[$k]}
                            num[$k]=${num[$j]}
                            num[$j]=$mid
                    else
                            continue
                    fi
            done
            let n--
    done
    
    #正序從小到大排列
    echo "sort from small to large:"
    for m in `seq 1 ${#num[@]}`;do
            echo -ne "${num[$m]}\t"
    done
    echo
    
    #逆序從大到小排列
    echo "sort from large to small:"
    
    for r in `seq 1 ${#num[@]}|tac`;do
            echo -ne "${num[$r]}\t"
    done
    echo

    執行結果為:

    blob.png

原創文章,作者:M20-1倪文超,如若轉載,請注明出處:http://www.www58058.com/39400

(0)
M20-1倪文超M20-1倪文超
上一篇 2016-08-23
下一篇 2016-08-24

相關推薦

  • 20160809作業

    一、如何設置tab縮進為4個字符       臨時設置:set tabstop=4       全局設置vim /etc/vimrc—>添加set tabstop=4       當前用戶生效,手動添加文…

    Linux干貨 2016-08-10
  • 文本處理練習題

    文本處理練習:   1.找出本機ip地址   [root@localhost ~]# ifconfig |head -2 |tail -1 |tr -s ' ' ':' |cut -d: -f3   10.1.252.221   2.查看本機分區最大的利用率   [root@l…

    Linux干貨 2016-08-08
  • Linux基礎知識

    命令的語法通用格式: # COMMAND OPTIONS ARGUMENTS COMMAND:  發起一命令:請求內核將某個二進制程序運行為一個進程; 程序 –> 進程 靜態 –> 動態(有生命周期) 命令本身是一個可執行的程序文件:二進制格式的文件,有可能會調用共享庫文件; 多數系統程序文件都存放在:/bin,…

    Linux干貨 2016-10-29
  • sed工具

    sed是一種流編輯器,它是文本處理中非常中的工具,能夠完美的配合正則表達式使用,功能不同凡響。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(patternspace),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有 改變,除非你使用重定向存儲輸出。Sed主要用來…

    2017-08-26
  • 腳本編程之變量

    簡單跟大家介紹一下腳本編程中的變量。 大家都知道,腳本編程,主要由三個部分組成,一是命令,二是變量,三是控制語句。 變量的使用,可以讓腳本變得更加簡潔,高效。 我們主要簡單講一下變量的概念,變量的類型,變量的種類,不同種類的變量是如何定義的,變量的基本操作,以及變量的配置文件。 了解了這些,我們還可以聊一聊變量的高級操作。 首先,什么是變量? 通俗一點講:變…

    Linux干貨 2017-04-17
  • 尋求別人幫助screen命令

    尋求別人幫助screen命令

    2017-11-20
欧美性久久久久