Shell腳本編程—數組、字符串處理

數組

變量:存儲單個元素的內存空間

數組:存儲多個元素的連續的內存空間

    數組名:整個數組只有一個名字;

    數組索引:編號從0開始;

         [數組名索引]

         #{ARRAY_NAME[INDEX]}

     注意:bash-4及之后的版本,支持自定義索引格式,而不僅僅是0,1,2…數字格式

          此類數組稱之為"關聯數組"

聲明數組:

     declare -a NAME:聲明索引數組

     declare -A NAME:聲明關聯數組

數組中元素的賦值方式:

    (1)一次只賦值一個元素

        ARRAY_NAME[INDEX]=value

    (2)一次賦值全部元素

        ARRAY_NAME=("VAL1" "VAL:2" "VAL3" …)

    (3)只賦值特定元素:

        ARRAY_NAME=([0]="VAL1" [3]="VAL4" …)

        注意:bash支持稀疏格式的屬組

    (4)read -a ARRAY_NAME

 

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

    注意:引用時,只給數組名,表示應用下標為0的元素

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

     ${ARRAY_NAME[@]}

[root@CentOS7 ~]# array=(one two three four)
[root@CentOS7 ~]# echo ${array[*]}
one two three four
[root@CentOS7 ~]#

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

    ${#ARRAY_NAME[*]}

    ${#ARRAY_NAME[@]}

[root@CentOS7 ~]# array=(one two three four)
[root@CentOS7 ~]# echo ${#array[*]}
4
[root@CentOS7 ~]#

引用數組中的所有元素:

    ${ARRAY_NAME[*]}

    ${ARRAY_NAME[@]}

    數組元素切片:${ARRAY_NAME[@]:offset:number}

        offset:要跳過的元素個數

        number:要取出的元素個數;省略number時,表示取偏移量之后的所有元素

[root@CentOS7 ~]# array=(one two three four)
[root@CentOS7 ~]# echo ${array[*]:2}
three four
[root@CentOS7 ~]#

向非稀疏格式數組中追加元素:

    ARRAY_NAME[$[#ARRAY_NAME[*]}]=

刪除數組中的某元素:

    unset ARRAY_NAME[INDEX]

關聯數組:

    declare -A ARRAY_NAME

    ARRAY_NAME=([index_name1]="value" [index_name2]="value2" …)

示例:

1.生成10個隨機數,并找出其中的最大值和最小值

[root@CentOS7 scripts]# cat random.sh 
#!/bin/bash
#

declare -a array
declare -i MAX=0
declare -i MIN=0

for I in $(seq 0 9)
do
	array[$I]=$RANDOM
	[ $I -eq 9 ] && echo "${array[$I]}" || echo -n "${array[$I]} "
	[ $I -eq 0 ] && MIN=${array[$I]}
	[ ${array[$I]} -gt $MAX ] && MAX=${array[$I]}
	[ ${array[$I]} -lt $MIN ] && MIN=${array[$I]}
done

echo "Max is: $MAX"
echo "Min is: $MIN"


[root@CentOS7 scripts]# bash random.sh 
17015 5923 5983 31353 19248 29430 5642 31040 5929 11513
Max is: 31353
Min is: 5642
[root@CentOS7 scripts]#

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

[root@CentOS7 scripts]# cat sum.sh 
#!/bin/bash
#

declare -a array
declare -i LINESUM=0
array=(/var/log/*.log)

for I in $(seq 0 $[${#array[*]}-1])
do
	if [ $[$I%2] -eq 0 ];then
		LINES=$(wc -l ${array[$I]} | cut -d' ' -f1)
		LINESUM+=$LINES
	fi
done

echo "Lines sum is: $LINESUM"
		
[root@CentOS7 scripts]# bash sum.sh 
Lines sum is: 682
[root@CentOS7 scripts]#

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

[root@CentOS7 scripts]# cat maopao.sh 
#!/bin/bash
#

echo "Please input a number list"
read -a LIST
echo

for ((I=0;I<${#LIST[*]}-1;I++))
do
	for ((J=0;J<${#LIST[*]}-1;J++))
	do
		if [ ${LIST[$J]} -gt ${LIST[$J+1]} ];then
			TMP=${LIST[$J]}
			LIST[$J]=${LIST[$J+1]}
			LIST[$J+1]=$TMP
		fi
	done
done

echo "after sort"
echo ${LIST[*]}

echo "==============================="

for ((I=0;I<${#LIST[*]}-1;I++))
do
	for ((J=0;J<${#LIST[*]}-1;J++))
	do
		if [ ${LIST[$J]} -lt ${LIST[$J+1]} ];then
			TMP=${LIST[$J]}
			LIST[$J]=${LIST[$J+1]}
			LIST[$J+1]=$TMP
		fi
	done
done

echo "before sort"
echo ${LIST[*]}
[root@CentOS7 scripts]# bash maopao.sh 
Please input a number list
5 10 8 18 3 20

after sort
3 5 8 10 18 20
===============================
before sort
20 18 10 8 5 3
[root@CentOS7 scripts]#

 

 

 

bash字符串處理工具

 

字符串切片

取字符串長度個數

    ${#VAR}:取變量的字符個數

[root@CentOS7 ~]# var=zhai
[root@CentOS7 ~]# echo ${#var}
4
[root@CentOS7 ~]#

字符串你切片:

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

[root@CentOS7 ~]# echo $test
abcdefghijklmnopqrstuvwxyz
[root@CentOS7 ~]# echo ${test:10}
klmnopqrstuvwxyz
[root@CentOS7 ~]#

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

[root@CentOS7 ~]# echo $test
abcdefghijklmnopqrstuvwxyz
[root@CentOS7 ~]# echo ${test:10:10}
klmnopqrst
[root@CentOS7 ~]#

    ${var: -lengh}:取字符串的最右側幾個字符

[root@CentOS7 ~]# echo $test
abcdefghijklmnopqrstuvwxyz
[root@CentOS7 ~]# echo ${test: -10}    #注意冒號之后必須有一個空格
qrstuvwxyz
[root@CentOS7 ~]#

    ${var:offset:-lengh}:從最左側跳過offset字符,一直取到字符串的最右側lengh個字符之前

[root@CentOS7 ~]# echo $test
abcdefghijklmnopqrstuvwxyz
[root@CentOS7 ~]# echo ${test:10: -10}
klmnop
[root@CentOS7 ~]#

 

 

基于模式取子串

    ${var#*word}:其中word是指定的分隔符;功能:自左而又,查找var變量所存儲的字符串中,第一次出現的word分隔符,刪除字符開頭至此分隔符之間的所有內容

[root@CentOS7 ~]# echo $test
root:x:0:0:root:/root:/bin/bash
[root@CentOS7 ~]# echo ${test#*:}    #自左而右,以:為分隔符,刪除第一次匹配到:之前的所有內容
x:0:0:root:/root:/bin/bash
[root@CentOS7 ~]#

    ${var##*word}:其中word是指定的分隔符;功能:自左而又,查找var變量所存儲的字符串中,最后一次出現的word分隔符,刪除字符開頭至此分隔符之間的所有內容

[root@CentOS7 ~]# echo $test
root:x:0:0:root:/root:/bin/bash
[root@CentOS7 ~]# echo ${test##*:}    #自左而右,最后一次匹配到:之前的所有內容
/bin/bash
[root@CentOS7 ~]#

    ${var%word*}:其中word是指定的分隔符;功能自右而左,查找var變量所存儲的字符串中,第一次出現的word分隔符,刪除此分隔符至字符串尾部之間的所有字符

[root@CentOS7 ~]# echo $test
root:x:0:0:root:/root:/bin/bash
[root@CentOS7 ~]# echo ${test%:*}    #自右而左,刪除第一次匹配到:之后的所有內容
root:x:0:0:root:/root
[root@CentOS7 ~]#

    ${var%%word*}:其中word是指定的分隔符;功能自右而左,查找var變量所存儲的字符串中,最后一次出現的word分隔符,刪除此分隔符至字符串尾部之間的所有字符

[root@CentOS7 ~]# echo $test
root:x:0:0:root:/root:/bin/bash
[root@CentOS7 ~]# echo ${test%%:*}    #自右而左,刪除最后一次匹配到:之后的所有內容
root
[root@CentOS7 ~]#

 

 

查找替換

    ${var/PATTERN/SUBSTI}:查找var所表示的字符串中,第一次被PATTERN所匹配到的字符串,將其替換為SUBSTI所表示的字符串

[root@CentOS7 ~]# echo $test
root:x:0:0:root:/root:/bin/bash
[root@CentOS7 ~]# echo ${test/root/zhai}    #第一次匹配到root的字符替換為zhai
zhai:x:0:0:root:/root:/bin/bash
[root@CentOS7 ~]#

    ${var//PATTERN/SUBSTI}:查找var所表示的字符串中,所有被PATTERN所匹配到的字符串,并將其替換為SUBSTI所表示的字符串

[root@CentOS7 ~]# echo $test
root:x:0:0:root:/root:/bin/bash
[root@CentOS7 ~]# echo ${test//root/zhai}    #替換所有root字符為zhai
zhai:x:0:0:zhai:/zhai:/bin/bash
[root@CentOS7 ~]#

   ${var/#PATTERN/SUBSTI}:查找var所表示的字符串中,行首被PATTERN所匹配到的字符串,將其替換為SUBSTI所表示的字符串 

[root@CentOS7 ~]# echo $test
root:x:0:0:root:/root:/bin/bash
[root@CentOS7 ~]# echo ${test/#root/zhai}    #替換行首為root的字符為zhai
zhai:x:0:0:root:/root:/bin/bash
[root@CentOS7 ~]#

    ${var/%PATTERN/SUBSTI}:查找var所表示的字符串中,行尾被PATTERN所匹配到的字符串,將其替換為SUBSTI所表示的字符串

[root@CentOS7 ~]# echo $test
root:x:0:0:root:/root:/bin/bash
[root@CentOS7 ~]# echo ${test/%bash/nologin}    #替換行尾為bash的字符串為nologin
root:x:0:0:root:/root:/bin/nologin
[root@CentOS7 ~]#

    

 

查找刪除

    ${var/PATTERN}:以PATTERN為模式查找var字符串中第一次匹配,并刪除之;

[root@CentOS7 ~]# echo $test
root:x:0:0:root:/root:/bin/bash
[root@CentOS7 ~]# echo ${test/root}    #刪除第一次出現root的字符
:x:0:0:root:/root:/bin/bash
[root@CentOS7 ~]#

    ${var//PATTERN}:以PATTERN為模式查找var字符串中所有匹配,并刪除之;

[root@CentOS7 ~]# echo $test
root:x:0:0:root:/root:/bin/bash
[root@CentOS7 ~]# echo ${test//root}    #刪除所有root字符串
:x:0:0::/:/bin/bash
[root@CentOS7 ~]#

    ${var/#PATTERN}:以PATTERN為行首查找var字符串中的匹配到的字符串,并刪除

[root@CentOS7 ~]# echo $test
root:x:0:0:root:/root:/bin/bash
[root@CentOS7 ~]# echo ${test/#root}    #刪除root開頭的字符串
:x:0:0:root:/root:/bin/bash
[root@CentOS7 ~]#

    ${var/%PATTERN}:以PATTERN為行尾查找var字符串中的匹配到的字符串,并刪除

[root@CentOS7 ~]# echo $test
root:x:0:0:root:/root:/bin/bash
[root@CentOS7 ~]# echo ${test/%bash}    #刪除以bash結尾的字符串
root:x:0:0:root:/root:/bin/
[root@CentOS7 ~]#

 

 

字符大小寫轉換

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

[root@CentOS7 ~]# echo $test
abcdefghijklmnopqrstuvwxyz
[root@CentOS7 ~]# echo ${test^^}
ABCDEFGHIJKLMNOPQRSTUVWXYZ
[root@CentOS7 ~]#

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

[root@CentOS7 ~]# echo $test
ABCDEFGHIJKLMNOPQRSTUVWXYZ
[root@CentOS7 ~]# echo ${test,,}
abcdefghijklmnopqrstuvwxyz
[root@CentOS7 ~]#

 

 

變量賦值

    ${var:-VALUE}:如果var變量為空,或未設置,則返回VALUE,否則輸出var變量的值

[root@CentOS7 ~]# echo $test

[root@CentOS7 ~]# echo ${test:-none}    #test變量為空,返回none
none
[root@CentOS7 ~]# test=zhai
[root@CentOS7 ~]# echo ${test:-none}    #test變量不空,返回test變量值
zhai
[root@CentOS7 ~]#

    ${var:=VALUE}:如果var變量為空,或未設置,則返回VALUE,并將VALUE賦值給var變量

[root@CentOS7 ~]# echo $test

[root@CentOS7 ~]# echo ${test:=none}    #test變量值為空,返回none,并把none賦值為變量test
none
[root@CentOS7 ~]# echo $test    #變量test值為none
none
[root@CentOS7 ~]# echo ${test:=true}    #變量test不空,則返回值
none
[root@CentOS7 ~]#

    ${var:+VALUE}:如果var變量不空,則返回VALUE;

[root@CentOS7 ~]# echo $test
zhai
[root@CentOS7 ~]# echo ${test:+true}    #test變量值不空,返回true
true
[root@CentOS7 ~]#

    ${var:?ERROR_INFO}:如果var變量為空,或未設置,則返回ERROR-INFO為錯誤提示,否則返回var變量的值

[root@CentOS7 ~]# echo $test

[root@CentOS7 ~]# echo ${test:?Error var}    #變量test值為空,返回錯誤信息
-bash: test: Error var
[root@CentOS7 ~]# echo $?        #命令狀態結果為非0
1
[root@CentOS7 ~]# test=zhai
[root@CentOS7 ~]# echo ${test:?Error var}    #變量test值非空,則返回值
zhai
[root@CentOS7 ~]#

 

 

變量類型聲明

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

    declare [OPTIONS] VAR

        -r:聲明變量為只讀變量

        -i:聲明變量為整數型變量

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

        -a:聲明為索引數組

        -A:聲明為關聯數組

        -l:聲明變量字符為小寫

        -u:聲明變量字符為大寫

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

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

 

變量間接引用

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

    variable1=variable2

    variable2=value

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

    bash提供了兩種格式的間接變量引用

    eval tempvar=\$$variable1
    tempvar=${!variable1}

    示例:

[root@CentOS7 ~]# one=two
[root@CentOS7 ~]# two=zhairuixiang
[root@CentOS7 ~]# three=${!one}
[root@CentOS7 ~]# echo $three
zhairuixiang
[root@CentOS7 ~]# eval four=\$$one
[root@CentOS7 ~]# echo $four
zhairuixiang
[root@CentOS7 ~]#

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

[root@CentOS7 ~]# cmd=whoami
[root@CentOS7 ~]# echo $cmd
whoami
[root@CentOS7 ~]# eval $cmd
root
[root@CentOS7 ~]#

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

(0)
zhai796898zhai796898
上一篇 2016-08-30
下一篇 2016-08-31

相關推薦

  • 軟件包管理工具—yum命令總結

    描述: YUM: Yellowdog Update Modifier, rpm的前端程序,用來解決軟件包相關依賴性,可以在多個庫之間定位軟件包,實現查詢、安裝、升級、刪除等功能 說明: yum repository: yum repo,存儲了眾多rpm包,以及包的相關的元數據文件(放置于特定目錄repodata下) 文件服務器: ftp:// http://…

    Linux干貨 2016-08-29
  • python 多版本管理(pyenv)

    01 – Python 簡介和安裝 01 – Python 簡介和安裝 1. Python 簡介 2. 安裝 pyenv 3. pyenv 使用 4. pyenv-virtualenv 5. 安裝 IPython 和 Jupyter 01 – Python 簡介和安裝 1. Python 簡介 編程風格 面向過程:以指令為…

    Linux干貨 2016-07-10
  • 博客作業-N22第二周

    1、linux上的文件管理類命令都有那些,其常用的使用方法及其相關示例演示。 答: cp 復制文件 [root@localhost network-scripts]# cp ifcfg-eno16777736 ifcfg-eno.bak [root@localhost network-scripts]# ls ifcfg-eno16777736  …

    Linux干貨 2016-08-22
  • 第二周liunx小總結

    第二周liunx小總結 1.“>” ;”>>”   “>” 把STDOUT重定向到文件    “2>”把STDERR重定向到文件   “&>” 把所有輸出重定向到文件* >文件內容會覆蓋    set -C: 禁止將內容…

    2017-07-20
  • DNS高級應用之子域授權&區域轉發

    一、環境準備:    1、準備三臺測試服務器,劃分如下:    主DNS服務器:eth0:192.168.10.203;負責mylinux.com域解析;確??梢哉=馕?nbsp;     子域DNS服務器:eth0:192.168.10.120; 負責子域ops.mylinux.com解析; &…

    Linux干貨 2015-06-01
  • 進程管理

    Process Manager 工作管理  jobs ctrl+z,& bg,fg nohup 進程,資源管理  查看:pstree,ps,top,vmstat,pmap 查詢:pgrep,pidof,fuser,lsof 管理:kill,nice,renice 管理軟件or命令  htop glances dstat …

    Linux干貨 2016-04-11
欧美性久久久久