linux的數組及字符串處理

一丶數組

1.定義

變量:存儲單個元素的內存空間
數組:存儲多個元素的連續的內存空間,相當於多個變量的
集合
數組名和索引
索引:編號從0開始,屬於數值索引

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

2.常用命令及選項

declare -x varname 設置環境變量
declare -i 聲明整數
declare -g 設置函數爲全局函數
declare -xf 設置環境函數
declare -a 數組名 聲明索引數組
declare -A 數組名 聲明關聯數組
declare -a 查看所有索引數組
declare -A 查看所有關係數組

3.數組一般格式

title[0]=boss
title[1]=ceo
title[2]=coo
title[3]=cto
~]# name=(liubei guanyu zhangfei zhaoyun)
~]# course=([0]=linux [2]=python [5]=oracle)

~]# read -a menu
huimian lamian yanroutang

script=(/root/t*.sh)
digit=({1..20})

例1:

數組賦值

~]# digit=(1 3 5)

數組的引用

~]# echo $digit $數組名 僅引用第一個值
1

~]# echo ${digit[1]} 指定下標以引用指定值
3

引用所有值

~]# echo ${digit[*]}
1 3 5
~]# echo ${digit[@]}
1 3 5

打印數量

~]# echo ${#digit[@]}
3

引用最後一個值

~]# echo ${digit[$[${#digit[@]}-1]]}
5

例2

分別顯示每一個值,每個值換一行。

~]# for n in $(seq 0 $[${#testshuzu[*]}-1]);do
echo testshuzu[$n] is ${testshuzu[$n]}
done

~]# testshuzu[0] is liubei
testshuzu[1] is guanyu
testshuzu[2] is zhaofei
testshuzu[3] is huangzhong
testshuzu[4] is zhaoyun

4.數組常用選項

在索引數組中加值,加到最後

~]# testshuzu[${#testshuzu[]}]=machao
~]# for n in $(seq 0 $[${#testshuzu[
]}-1]);do echo testshuzu[$n] is ${testshuzu[$n]}; done
testshuzu[0] is liubei
testshuzu[1] is guanyu
testshuzu[2] is zhaofei
testshuzu[3] is huangzhong
testshuzu[4] is zhaoyun
testshuzu[5] is machao

刪除數組中的某個值

~]# unset testshuzu[1]

刪除整個數組

~]# unset testshuzu

數組的切片
offset: 要跳過的元素個數
number: 要取出的元素個數
取偏移量之後的所有元素

~]# echo ${testshuzu[]:1:3}
zhaofei weiyan zhaoyun
~]# echo ${testshuzu[
]:1} 跳過一個值,取到最後
zhaofei weiyan zhaoyun machao machao

關聯數組
兩種方式:
一:先聲明,再賦值

~]# declare -A testshuzu
~]# testshuzu=([zhugong]=liubei [erdi]=guanyu [sandi]=zhangfei)

二:聲明,賦值一步到位

declare -A weiguo=([chengxiang]=caocao [junshi]=simayi [jiangju]=xiahoudun )

例3

寫一個腳本會生成一個名爲digit的數組包含10個隨機數,顯示數組的所有值,再顯示最大值,最小值。

#!/bin/bash
declare -i min max #聲明最大值和最小值
declare -a digit #創建數組名
for ((i=0;i<10;i++));do #從0開始循環,循環10次
digit[$i]=$RANDOM #數組是隨機數
[ $i -eq 0 ] && min=${digit[0]} && max=${digit[0]} && continue #將第一次隨機數賦給最大最小值進行下次循環
[ ${digit[$i]} -gt $max ] && max=${digit[$i]} && continue #上一次隨機數和這一次相比 取最大值
[ ${digit[$i]} -lt $min ] && min=${digit[$i]} && continue #上一次隨機數和這一次相比 取最小值
done
echo All digit are ${digit[*]} #輸出所有隨機數
echo Max is $max
echo Min is $min

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

#!/bin/bash
Sum=0
File=(/var/log/.log) #創建數組
for ((i=0;i<=$[${#File[
]}-1];i++));do #循環到所有數組
if [ $[$i%2] -eq 0 ];then #判斷是否爲偶數文件
Line=$(cat ${File[$i]} | wc -l) #統計偶數文件行數
Sum=$[$Sum+$Line] #將每次循環的文件行數加起來
fi
done
echo $Sum

二丶字符串處理

~]# echo ${name}
dema西亞
~]# echo ${name:2:3} #從左邊跳過2個字符,取3個字符
ma西
~]# echo ${name:2} #從左邊跳過2個字符,取到最後
ma西亞

~]# echo ${name: -2} #從右向左取2個字符,注意冒號後至少打一個空格
西亞

~]# echo ${name: -3: 1} #從右向左取3個字符,再從左向右取1個字符
a
~]# echo ${name: -3: -1} #從右向左取3個字符,再從右向左去掉1個字符
a西
~]# echo ${name:3:-1} #從左邊跳過3個字符,從右邊跳過1個字符
a西

從左至右查找

~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
~]# echo ${PATH#local}
/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
~]# echo ${PATH##
local} #貪婪模式
/bin:/usr/sbin:/usr/bin:/root/bin

從左至右查找

~]# echo ${PATH}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
~]# echo ${PATH%local}
/usr/local/sbin:/usr/
~]# echo ${PATH%%local
}
/usr/

查找替換

~]# ${var/pattern/substr} #查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substr替換之
~]# ${var//pattern/substr} #查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substr替換之
~]# ${var/#pattern/substr} #查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substr替換之
~]# ${var/%pattern/substr} #查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substr替換之

查找並刪除

~]# ${var/pattern} #刪除var所表示的字符串中第一次被pattern所匹配到的字符串
~]# ${var//pattern} #刪除var所表示的字符串中所有被pattern所匹配到的字符串
~]# ${var/#pattern} #刪除var所表示的字符串中所有以pattern爲行首所匹配到的字符串
~]# ${var/%pattern} #刪除var所表示的字符串中所有以pattern爲行尾所匹配到的字符串

大小寫轉換

~]# name="Zhangfei LiuBeI"
~]# echo ${name,,}
zhangfei liubei
~]# echo ${name^^}
ZHANGFEI LIUBEI

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章