數組
變量:存儲單個元素的內存空間
數組:存儲多個元素的連續的內存空間,相當于多個變量的集合。
數組名和索引
索引:編號從0開始,屬于數值索引
注意:索引可支持使用自定義的格式,而不僅是數值格式,即為關聯索引, bash4.0版本之后開始支持。
bash的數組支持稀疏格式(索引不連續)
定義數組
聲明數組:
declare -a ARRAY_NAME
declare -A ARRAY_NAME: 關聯數組
數組元素的賦值:
(1) 一次只賦值一個元素;
ARRAY_NAME[INDEX]=VALUE
weekdays[0]="Sunday"
weekdays[4]="Thursday"
(2) 一次賦值全部元素:
ARRAY_NAME=("VAL1" "VAL2" "VAL3" …)
(3) 只賦值特定元素:
ARRAY_NAME=([0]="VAL1" [3]="VAL2" …)
(4) 交互式數組值對賦值
read -a ARRAY
引用數組
引用數組元素: ${ARRAY_NAME[INDEX]}
注意:省略[INDEX]表示引用下標為0的元素
數組的長度(數組中元素的個數):
${#ARRAY_NAME[*]}
${#ARRAY_NAME[@]}
示例:生成10個隨機數保存于數組中,并找出其最大值和最小值 #!/bin/bash declare -a rand declare -i max=0 for i in {0..9}; do rand[$i]=$RANDOM echo ${rand[$i]} [ ${rand[$i]} -gt $max ] && max=${rand[$i]} done echo "Max: $max"
例:寫一個腳本,定義一個數組,數組中的元素是/var/log目錄下所有以.log結尾的文件;要統計其下標為偶數的文件中的行數之和 #!/bin/bash # declare -a files files=(/var/log/*.log) declare -i lines=0 for i in $(seq 0 $[${#files[*]}-1]); do if [ $[$i%2] -eq 0 ];then let lines+=$(wc -l ${files[$i]} | cut -d' ' -f1) fi done echo "Lines: $lines."
數組數據處理
引用數組中的元素:
所有元素: ${ARRAY[@]}, ${ARRAY[*]}
數組切片: ${ARRAY[@]:offset:number}
offset: 要跳過的元素個數
number: 要取出的元素個數
取偏移量之后的所有元素
${ARRAY[@]:offset}
向數組中追加元素:
ARRAY[${#ARRAY[*]}]
刪除數組中的某元素:導致稀疏格式
unset ARRAY[INDEX]
關聯數組:
declare -A ARRAY_NAME
ARRAY_NAME=([idx_name1]=('val1' [idx_name2]='val2‘…)
字符串處理
bash的字符串處理工具:
字符串切片:
${#var}:返回字符串變量var的長度
${var:offset}:返回字符串變量var中從第offset個字符后(不包括第offset個字符)的字符開始,到最后的部分,offset的取值在0 到 ${#var}-1 之間
${var:offset:number}:返回字符串變量var中從第
offset個字符后(不包括第offset個字符)的字符開始,長度為number的部分
${var: -lengh}:取字符串的最右側幾個字符:
注意:冒號后必須有一空白字符
基于模式取子串:
${var#*word}:其中word可以是指定的任意字符
功能:自左而右,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串開頭至第一次出現word字符之間的所有字符
${var##*word}:同上,不同的是,刪除的是字符串開頭至最后一次由word指定的字符之間的所有內容
file="/var/log/messages"
${file##*/}: messages
${var%word*}:其中word可以是指定的任意字符;
功能:自右而左,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串最后一個字符向左至第一次出現word字符之間的所有字符;
file="/var/log/messages"
${file%/*}: /var/log
${var%%word*}:同上,只不過刪除字符串最右側的字符向左至最后一次出現word字符之間的所有字符;
示例: url=http://www.magedu.com:80
${url##*:} 80
${url%%:*} http
查找替換: ${var/pattern/substi}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substi替換之 ${var//pattern/substi}: 查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substi替換之 ${var/#pattern/substi}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substi替換之 ${var/%pattern/substi}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substi替換之 字符串處理 查找并刪除: ${var/pattern}:查找var所表示的字符串中,刪除第一次被pattern所匹配到的字符串 ${var//pattern}:所有 ${var/#pattern}:首行 ${var/%pattern}:行尾 字符大小寫轉換: ${var^^}:把var中的所有小寫字母轉換為大寫 ${var,,}:把var中的所有大寫字母轉換為小寫 變量賦值 ${var:-value}:如果var為空或未設置,那么返回value;否則,則返回var的值 ${var:+value}:如果var不空,則返回value ${var:=value}:如果var為空或未設置,那么返回value,并將value賦值給var;否則,則返回var的值 ${var:?error_info}:如果var為空或未設置,那么返回error_info;否則,則返回var的值
高級變量用法-有類型變量
Shell變量一般是無類型的,但是bash Shell提供了declare和typeset兩個命令用于指定變量的類型,兩個命令是完全等價的
declare [選項] 變量名
-r 將變量設置為只讀屬性
-i 將變量定義為整型數
-a 將變量定義為數組
-f 顯示此腳本前定義過的所有函數名及其內容
-F 僅顯示此腳本前定義過的所有函數名
-x 將變量聲明為環境變量
-l 將變量值轉為小寫字母
-u 將變量值轉為大寫字母
間接變量引用
如果第一個變量的值是第二個變量的名字,從第一個變量引用第二個變量的值就稱為間接變量引用
variable1=variable2
variable2=value
variable1的值是variable2,而variable2又是變量名,
variable2的值為value,間接變量引用是指通過variable1獲得變量值value的行為
間接變量引用
bash Shell提供了兩種格式實現間接變量引用
eval tempvar=\$$variable1
tempvar=${!variable1}
安裝復制文件
install命令:
install [OPTION]… [-T] SOURCE DEST 單文件
install [OPTION]… SOURCE… DIRECTORY
install [OPTION]… -t DIRECTORY SOURCE…
install [OPTION]… -d DIRECTORY…創建空目錄
選項:
-m MODE,默認755
-o OWNER
作業:生成10個隨機數,采用冒泡算法進行升序或降序排序
[root@localhost ~]# cat maopao.sh #!/bin/bash declare -a arr for i in "$@"; do arr[${#arr[*]}]=$i done echo "${arr[*]}" for j in `seq 0 $[${#arr[*]}-2]`; do for k in `seq 0 $[$[${#arr[*]}-2]-$j]`; do if [[ ${arr[$k]} -gt ${arr[$[$k+1]]} ]];then num=${arr[$[$k+1]]} arr[$[$k+1]]=${arr[$k]} arr[$k]=$num fi done done echo "${arr[*]}" [root@localhost ~]# bash maopao.sh 1 2 3 5 48 21 1 54 12 0 12 0 12 0 1 2 3 5 48 21 1 54 12 0 12 0 12 0 0 0 0 1 1 2 3 5 12 12 12 21 48 54
作業2:
刪除內核包,并修復
1、查看內核包:
rpm -q kernrl
2、刪除內核包,忽略依賴性
rpm -e kernel –nodeps
3、重啟發現啟動不了
4、虛擬機設置光盤連接
5、重啟按esc進入bios選擇光盤啟動
6、進入救援模式
7、修復內核不需要網絡連接,選擇no
8、選擇continue
9、提示進入root模式使用該命令
10、提示原系統掛載在/mnt/sysimage下
11、選擇打開一個shell
12、df查看分區情況
13、掛載光盤至/tmp/ cd到光盤目錄,使用rpm安裝內核包,指定原系統在/mnt/sysimage
14、安裝完成后reboot重啟,耐心等待啟動,這里可能有點慢
15、啟動成功
原創文章,作者:M20-1--孔祥文,如若轉載,請注明出處:http://www.www58058.com/39940
文章對數組的知識總結的較為全面,如果能對切片工具的使用做一個更為詳細的總結介紹,會讓讀者能清晰的明白數組的用法。