數組定義:
能夠存儲多個元素的內存空間,每個元素在數組中具有特定的索引編號,我們可以通過變量名和索引編號來查看數組中的某一元素。
數組分類:
索引數組:
定義:索引編號從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