數組
變量:存儲單個元素的內存空間
數組:存儲多個元素的連續的內存空間
數組名:整個數組只有一個名字;
數組索引:編號從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