shell腳本變成之數組、字符串處理及其它功能補充

數組定義:

                 能夠存儲多個元素的內存空間,每個元素在數組中具有特定的索引編號,我們可以通過變量名和索引編號來查看數組中的某一元素。

        數組分類:

                 索引數組

                                定義:索引編號從0開始,依次遞增加一,如:0、1、2、3…

                                            array[0]、array[1]、array[2]…

                                聲明方式:declare -a arrayname

                            

                 關聯數組

                                 定義:索引內容可以由我們自行指定,在bash4.0版本以后開始支持。

                                            array[haha]、array[xixi]、array[enen]…

                                聲明方式:declare -A arrayname

                                            注意:索引數組在使時必須事先聲明,否則調用時會出錯,如下圖所示。

            root@cenots6.8  ~ # array[a]=1            
            root@cenots6.8  ~ # array[b]=2
            root@cenots6.8  ~ # array[c]=3
            root@cenots6.8  ~ # array[d]=4
            root@cenots6.8  ~ # echo ${array[@]}
            4
            root@cenots6.8  ~ # declare -A array
            root@cenots6.8  ~ # array[a]=1
            root@cenots6.8  ~ # array[b]=2
            root@cenots6.8  ~ # echo ${array[a]}
            1
            root@cenots6.8  ~ # echo ${array[b]}
            2
            root@cenots6.8  ~ # unset array            
            root@cenots6.8  ~ # array[0]=1
            root@cenots6.8  ~ # array[1]=2
            root@cenots6.8  ~ # array[2]=3
            root@cenots6.8  ~ # echo ${array[@]}
            1 2 3

       

        數組的賦值方式:

                 a、每次賦值一個元素:

                           array_name[index]=vallue

                           舉例:array[0]=1 ## 將1賦值給數組中索引為0的元素,也可以理解為數組中第一個位置處存放的元素為1                   

                 b、一次賦值全部元素:

                            array_name=("value1"空格“value2”空格“value3”…)

                            舉例:array=(haha xixi enen)          ##這里需要注意,如果之前array已經賦過值了,那么之數組的值將被覆蓋。

                 c、只賦值特定元素:

                            array_name=([0]="value1"空格"[2]=value2"空格[3]="value3"…)

                            舉例:array=([0]=1 [3]="xixi" [4]="abc")         ###注意:bash的數組支持稀疏格式(索引不連續)

                  d、交互式賦值:

                            read -a array_name

            root@cenots6.8  ~ # read -a array            
            1 aa bb 3 4
            root@cenots6.8  ~ # echo ${array[@]}
            1 aa bb 3 4

                e、向稀疏數組中追加元素:

                            array[${#array_name[@]}]=value

                f、刪除數組中的某一元素

                            unset array[index]

        數組的引用:

                引用數組元素:${array_name[index]}          ##這里需要注意如果省略“{}”,則表示引用下表為0的元素。     

                引用數組中的所有元素:${array_name[@]} 或 ${array_name[*]}

                數組的長度:${#array_name[*]}  或 ${#array_name[@]}

        數組數據處理:

                數組切片:${array_name[*]:offset:number}    

                                offset:跳過多少個 ;number:顯示多少個;處理順序:從做到右

            root@cenots6.8  ~ # array=(1 2 3 4 5 6 7 8 9 10)            
            root@cenots6.8  ~ # echo ${array[@]:6:2}
            7 8
            root@cenots6.8  ~ # echo ${array[@]:6}
            7 8 9 10

                      

字符串處理:

        字符串切片:

                1、${#var}:返回字符串var的長度,此處用法等同于${#array_name[@]}

            root@cenots6.8  ~ # var=`getent passwd root`            
            root@cenots6.8  ~ # echo ${#var}
            39

                2、${var:offset:number}:返回字符串變量var中,從左到右的順序,先跳過“offset”個字符,然后顯示其后面的“number”個字符

            root@cenots6.8  ~ # var=`getent passwd root`            
            root@cenots6.8  ~ # echo $var
            root:x:0:0:bb,,62985600:/root:/bin/bash
            root@cenots6.8  ~ # echo ${var:3:3}
            t:x

                3、${var:offset}:返回字符串變量var中,從做到右的順序,跳過“offset”個字符,顯示剩余的部分

            root@cenots6.8  ~ # echo ${var:3}            
            t:x:0:0:bb,,62985600:/root:/bin/bash

                4、${var:空格-number}:從右往左顯示“number”個字符(-number選項需要在bash4.2以后的版本才能使用)

            root@cenots6.8  ~ # echo ${var: -4}            
            bash

                5、${var:offset:空格-number}:從左往右的順序,先跳過“offset”個字符,然后取到最右側number個長度字符之前。(-number選項需要在bash4.2以后的版本才能使用)

            root@Centos7.2  ~ # var=`getent passwd root`            
            root@Centos7.2  ~ # echo ${var:3: -3}
            t:x:0:0:root:/root:/bin/b

       

        基于模式取子串:

                1、${var#*PARTTERN}:此處PARTTERN可以指定任意字符, 自左向右查找第一次匹配到PARTTERN的內容,然后從行首刪到第一次匹配到的所有內容。

            root@cenots6.8  ~ # echo $var            
            root:x:0:0:bb,,62985600:/root:/bin/bash
            root@cenots6.8  ~ # echo ${var#*/}
            root:/bin/bash

                2、${var##*PARTTERN}:自左向右查找最后一次匹配到PARTTERN的內容,然后從行首刪除之最后一次匹配到的所有內容。

            root@cenots6.8  ~ # echo $var            
            root:x:0:0:bb,,62985600:/root:/bin/bash
            root@cenots6.8  ~ # echo ${var##*/}
            bash

                3、${var%PARTTERN*}:自右向左的順序查找第一次匹配到的內容,然后從右面行首刪除至第一次匹配到的所有內容。

            var=root:x:0:0:bb,,62985600:/root:/bin/bash            
            root@cenots6.8  ~ # echo ${var%/*}
            root:x:0:0:bb,,62985600:/root:/bin

                 4、${var%%PARTTERN*}:自右向左的順序查找最后一次匹配到的內容,然后從右面行首刪除至最后一次匹配到的所有內容。

            root@cenots6.8  ~ # echo $var            
            root:x:0:0:bb,,62985600:/root:/bin/bash
            root@cenots6.8  ~ # echo ${var%%/*}
            root:x:0:0:bb,,62985600:

 

        查找替換:

                 1、${var/PARTTERN/substi}:自左向右,查找var所表示的字符串中,第一次被PARTTERN所匹配到的字符串,用substi替換

            root@cenots6.8  ~ # echo $var            
            root:x:0:0:bb,,62985600:/root:/bin/bash
            root@cenots6.8  ~ # echo ${var/root/david/}
             naruto/:x:0:0:bb,,62985600:/root:/bin/bash

                  2、${var//PARTTERN/sbusti}:自左向右,查找var所表示的字符串中,所有次被PARTTERN所匹配到的字符串,用substi替換

            root@cenots6.8  ~ # echo $var            
            root:x:0:0:bb,,62985600:/root:/bin/bash
            root@cenots6.8  ~ # echo ${var//root/naruto}
            naruto:x:0:0:bb,,62985600:/naruto:/bin/bash

                 3、${var/#PARTTERN/sbusti}:查找var所表示的字符串中,行首被PARTTERN所匹配到的字符串,用sunsti替換

            root@cenots6.8  ~ # echo $var
            root:x:0:0:bb,,62985600:/root:/bin/bash
            root@cenots6.8  ~ # echo ${var/#root/naruto}
            naruto:x:0:0:bb,,62985600:/root:/bin/bash

                 4、${var/%PARTTERN/sbusti}:查找var所表示的字符串中,行尾被PARTTERN所匹配到的字符串,用sunsti替換

            root@cenots6.8  ~ # echo ${var/%bash/naruto}            
            root:x:0:0:bb,,62985600:/root:/bin/naruto

        查找刪除:

                1、${var/PARTTERN}:查找var所表示的字符串中,第一次被PARTTERN所匹配到的內容并刪除。

            root@cenots6.8  ~ # echo $var
            root:x:0:0:bb,,62985600:/root:/bin/bash
            root@cenots6.8  ~ # echo ${var/root}
            :x:0:0:bb,,62985600:/root:/bin/bash

                2、${var//PARTTERN}:查找var所表示的字符串中,所有被PARTTERN所匹配到的內容并刪除。

            root@cenots6.8  ~ # echo ${var//root}            
            :x:0:0:bb,,62985600:/:/bin/bash

                3、${var/PARTTERN}:查找var所表示的字符串中,行首被PARTTERN所匹配到的內容并刪除。

                4、${var/PARTTERN}:查找var所表示的字符串中,行尾被PARTTERN所匹配到的內容并刪除。

        字符串大小寫轉換:

                1、${var^^}:把var中所有小寫字符轉換為大寫

            root@cenots6.8  ~ # echo $var            
            root:x:0:0:bb,,62985600:/root:/bin/bash
            root@cenots6.8  ~ # echo ${var^^}
            ROOT:X:0:0:BB,,62985600:/ROOT:/BIN/BASH

                2、${var,,}:把var中所有大寫字符轉換為小寫

變量賦值的特殊方式:

                1、${var:-value}:如果var值為空,那么反饋value的值,否則,返回var的值

            root@cenots6.8  ~ # echo ${var:-abc}            
            abc
            root@cenots6.8  ~ # var=123
            root@cenots6.8  ~ # echo ${var:-abc}
            123

                2、${var:+value}:如果var值不為空,那么返回value的值,否則返回var的值

            root@cenots6.8  ~ # var=123            
            root@cenots6.8  ~ # echo ${var:+abcd}
            abcd

                3、${var:=value}:如果var值為空,則返回value的值,然后將value的值賦給var,否則返回var的值

            root@cenots6.8  ~ # unset var
            root@cenots6.8  ~ # echo ${var:=naruto}
            naruto
            root@cenots6.8  ~ # echo $var
            naruto

                4、${var:?error_info}:如果var值為空,則返回那么在當前終端打印error_info,否則返回var的值

            root@cenots6.8  ~ # unset var            
            root@cenots6.8  ~ # echo ${var:?Are you kiding me?}
            -bash: var: Are you kiding me?

高級變量用法:

            shell是一種弱類型語言,因此我們在給變量賦值時,自動默認為字符串類型,當我們需要指定某些某些特殊變量類型時可通過declare命令指定,方法如下:

                格式:declare options varname

                選項:-r  將變量設置為只讀變量

                          -i   將變量定義為整形

                          -a  將變量定義為索引數組

                          -A  將變量定義為關聯數組

                          -x  將變量定義為環境變量 ,等同與export

                          -I   將變量值轉換為小寫字母 declare -I var=UUID

                          -u  將變量值轉換為大寫字母  declare -u var=uuid

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

間接變量引用:

            間接變量:變量a中存有元素,然后將變量a當做b的元素存儲起來,當我們調用b時,就可以查看a中的內容,此時我們稱之為變量的間接引用。

            root@cenots6.8  ~ # a=wahaha            
            root@cenots6.8  ~ # b=a
            root@cenots6.8  ~ # echo ${!b}

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

            root@cenots6.8  ~ # cmd=whoami            
            root@cenots6.8  ~ # echo $cmd
            whoami
            root@cenots6.8  ~ # eval $cmd
            root
            root@cenots6.8  ~ # $cmd
            root

創建臨時文件:

            命令:mktemp,創建臨時文件,通過尾部#為的隨機字符,可以避免沖突

            格式:mktemp [option]…fileName.XXX    (XXX至少三個,可以更多,多多少?你試試)

            root@cenots6.8  ~ # mktemp a.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX            
            a.Cavjq0rtlW7uLTGnzk34auduckfw37HjicbSiwEvP

            選項:-d:創建臨時目錄

                      -p DIR 或 –tmpdir=DIR:指明臨時文件所在目錄的位置

            root@cenots6.8  ~ # mktemp -d ~/tempdir.XXX            
            /root/tempdir.wUB
            root@cenots6.8  ~ # mktemp -p ~/tempdir.wUB a.XXXX
            /root/tempdir.wUB/a.2jDI

安裝復制文件:

            命令:install

            功能:此install 將文件(通常僅是編譯后的文件)復制到您所選擇的目的位置

            格式:

                    1、install [options]…[-T] source dest 單個文件

                           舉例:如下所示,經install復制過的文件權限發生了變化,由644變成了755自動加了執行權限

            root@cenots6.8  ~ # touch aa            
            root@cenots6.8  ~ # install aa bb 
            root@cenots6.8  ~ # ll aa bb
            -rw-r--r--. 1 root root 0 8月  24 13:47 aa
            -rwxr-xr-x. 1 root root 0 8月  24 13:47 bb

                    2、install [option]…source…directory 

                             舉例:復制文件到指定目錄中,并給文件添加執行權限

            root@cenots6.8  ~ # cd /testdir/
            root@cenots6.8  /testdir # install ee ~/
            root@cenots6.8  /testdir # cd 
            root@cenots6.8  ~ # ll ee
            -rwxr-xr-x. 1 root root 0 8月  24 16:12 ee

                    3、install [OPTION]… -t DIRECTORY SOURCE…

                            舉例:復制文件到指定目錄中,并添加執行權限

            root@cenots6.8  ~ # touch ee            
            root@cenots6.8  ~ # ll ee
            -rw-r--r--. 1 root root 0 8月  24 16:09 ee
            root@cenots6.8  ~ # install -t /testdir/ ee
            root@cenots6.8  ~ # ll /testdir/ee 
            -rwxr-xr-x. 1 root root 0 8月  24 16:10 /testdir/ee

                    4、install [OPTION]… -d DIRECTORY…

                            舉例:創建空目錄,并附加權限

            root@cenots6.8  ~ # install -m 777 -d dir            
            root@cenots6.8  ~ # ll dir -d
            drwxrwxrwx. 2 root root 4096 8月  24 16:04 dir

            選項:
                    -m MODE,默認755
                    -o OWNER
                    -g GROUP

            root@cenots6.8  ~ # install -m 222 -o xixi -g root aa cc            
            root@cenots6.8  ~ # ll cc
            --w--w--w-. 1 xixi root 0 8月  24 16:02 cc

bash的配置文件:

            按生效范圍劃分,存在兩類:

                全局配置:

                        /etc/profile

                        /etc/profile.d/*.sh

                        /etc/bashrc

                個人配置:

                        ~/.bash_profile

                        ~/.bashrc

            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

             根據profile和bashrc來分類:

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

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

             修改profile和bashrc文件后需生效    

                                兩種方法:
                                    1、重新啟動shell進程    
                                    2 、source或 "."

                bash的退出任務

                        保存在~/.bash_logout文件中(用戶)在退出登錄shell時運行
                        功能:
                                創建自動備份
                                清除臨時文件   

1、編寫腳本,定義一個數組,數組中的元素是/var/log目錄下所有以.log結尾的文件;要統計其下標為偶數的文件中的行數之和

#!/bin/bash
declare -a log
declare -i j=0
declare -i hang=0
declare -i sum=0
for i in `ls /var/log/*.log`
do
        log[$j]=$i
        if [[ $j%2 -eq 0 ]];then
                hang=$(cat ${log[$j]}|wc -l)
                sum=$sum+$hang
        fi
        let j++
done
echo $sum
#!/bin/bash
declare -i sum=0
declare -i a=0
declare -a files
files=(/var/log/*.log)
for a in `seq 0 $[${#files[*]}-1]`
do
        if [[ $a%2 -eq 0 ]];then
                hang=$(cat ${files[$a]} | wc -l)
                sum=$sum+$hang
        fi
done

echo "Lines: $sum"

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

#!/bin/bash
#
#輸入若干個數值存入數組中,采用冒泡算法進行升序或降序排序

declare -a Num
declare -i i
declare -i j

Num=($@)
let Count=${#Num[@]}-1
for((i=0;i<=$Count;i++))
do
        for j in `seq 0 $Count`
        do
                if [ ${Num[i]} -lt ${Num[j]} ];then
                        max=${Num[j]}
                        Num[j]=${Num[i]}
                        Num[i]=$max
                fi
        done
done
echo ${Num[@]}
root@cenots6.8  /testdir # ./maopao.sh 234 5 65 7657 87 98 3455
5 65 87 98 234 3455 7657

3、讓用戶(管理員或所有用戶)的PATH環境變量的值多出一個路徑,例如: /usr/local/apache2/bin

cd /etc/profile.d/
vim apache.sh
PATH=$PATH:/usr/local/apache2/bin
保存退出vim
. apache.sh 或者重新登陸即可

4、用戶wang登錄時自動啟用別名rm=‘rm –i’

su -wang 
vim ~/.bashrc
alias rm=‘rm –i’
保存退出vim
source ./bashrc

5、用戶登錄時,顯示紅色字體的警示提醒信息“ hi,dangerous!”

cd /etc/profile.d/
vim login.sh
echo “hi,dangerous”
保存退出vim
. login.sh 或者重新登陸即可

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

(6)
NarutoNaruto
上一篇 2016-08-24
下一篇 2016-08-24

相關推薦

  • 魔術方法

    Edit 魔術方法 使用Python的魔術方法的最大優勢在于他們提供了一種簡單的方法來讓對象可以表現的像內置類型一樣。那意味著你可以避免丑陋的,違反直覺的,不標準的的操作方法。 特殊屬性 屬性 含義 __name__ 類、函數、方法等名字 __module__ 類定義所在的模塊名? __class__ 對象或類所屬的類 __bases__ 類的基類的元組,順…

    Linux干貨 2017-11-21
  • 第一周博客 計算機組成及Linux基礎入門

    1、描述計算機組成及其功能。
    2、描述羅列Linux的發行版,并描述不同發行版之間的聯系和區別。
    3、描述Linux的哲學思想,并按照自己的理解對其進行解釋。
    4、說明Linux系統上命令的使用格式,詳細介紹ifconfig、echo、tty、startx、export、pwd、history、
    shutdown、poweroff、reboot、hwclock、date命令的使用,并配合相應的示例說明闡述。
    5、如何在Linux系統上獲取命令的幫助信息,請詳細列出,并描述man文檔的章節是如何劃分。
    6、請羅列Linux發行版的基礎目錄名稱命名法則及功能規定。

    2017-12-02
  • linux 系統啟動流程

    假設以個人架設的linux主機為例:當你按下電源鍵之后,計算機硬件會主動讀取BIOS來加載硬件信息及進行硬件系統的自我測試,之后系統會主動讀取系統第一個可啟動的設備,此時就可以讀入引導裝載程序了。 引導程序可以指定使用哪個內核文件來啟動,并實際加載內核到內存中解壓縮與執行,此時內核就能夠開始在內存內活動,并檢測所有硬件信息,與加載適當的驅動程序來使這部主機開…

    Linux干貨 2016-09-12
  • Linux命令之:setfacl和getfacl

    命令總結之:setfacl和getfacl acl:access control list,實現靈活的權限管理 除了文件的所有者,所屬組合其他人,可以對更多的用戶設置權限 acl生效順序:所有者、自定義用戶、自定義組、其他人 1、首先我們查看man幫助文檔說明 [root@centos7 sixijie]# man setfac…

    Linux干貨 2016-08-04
  • awk多分隔符

    awk的-F參數可以指定新的分隔符,有些時候可能需求指定多個分隔符,比如下面的內容 [root@N1 ~]# netstat -an | grep ESTAB udp 0 0 192.168.1.120:35570 212.47.249.141:123 ESTABLISHED udp 0 0 192.168.1.120:55589 108.59.2.24:1…

    Linux干貨 2017-08-09
欧美性久久久久