數組
變量:存儲單個元素的內存空間 數組:存儲多個元素的連續的內存空間,相當于多個變量的集合 數組名:整個數組只有一個名字 數組索引:編號從0開始,屬于數值索引 數組名[索引], ${ARRAY_NAME[INDEX]} 要注意的是bash-4以及之后的版本支持自定義索引格式,而不僅僅是0,1,2,3...數字格式 此類數組稱之為”關聯數組“
聲明數組:
declare -a NAME?。郝暶魉饕龜到M declare -A NAME :聲明關聯數組 關聯數組必須先聲明后使用
數組中元素的賦值方式:
(1)一次只賦值一個元素 ARRAY_NAME[INDEX]=VALUE [root@localhost fun]# tianshi[0]="datianshi" [root@localhost fun]# tianshi[1]="xiaotianshi" [root@localhost fun]# tianshi[2]="heitianshi" (2)一次賦值全部元素 ARRAY_NAME=(“VAL1“ ”VAL2“ ”VAL3“...) (1) [root@localhost fun]# tianshi=("datianshi" "xiaotianshi" "heitianshi") (2)[root@localhost fun]# file=(/root/*) (3) [root@localhost fun]# file=(`ls /root/`) (3)只賦值特定元素 ARRAY_NAME=([0]="val1" [3]="val4"...) [root@localhost fun]# tianshi=([0]="datianshi" [2]="heitianshi") 注意:bash支持稀疏格式的數組 (4)read -a ARRAY_NAME [root@localhost fun]# read -a tianshi datianshi heitianshi xiaotianshi [root@localhost fun]# echo ${tianshi[*]} datianshi heitianshi xiaotianshi
數組引用
引用數組中的元素: ${ARRAY_NAME[INDEx]} 注意:引用時,只給數組名,表示引用下標為0的元素。 ${ARRAY_NAME[*]}:引用數組中的所有元素 ${ARRAY_NAME[@]}:引用數組中的所有元素 數組的長度(數組中元素的個數): ${#ARRAY_NAME[*]} ${#ARRAY_NAME[@]} [root@localhost ~]# haochide[0]=baozi [root@localhost ~]# haochide[1]=hongshaorou [root@localhost ~]# haochide[2]=gongbaojiding [root@localhost ~]# haochide[3]=jiangzhouzi [root@localhost ~]# echo ${#haochide[@]} 4 [root@localhost ~]# echo ${#haochide[*]} 4
數組元素切片:
${ARRAY_NAME[@]:offset:number} offset:要跳過的元素個數 number:要取出的元素個數 省略number的話是表示偏移量之后的所有元素 [root@localhost ~]# echo ${haochide[@]:1:2} hongshaorou gongbaojiding [root@localhost ~]# echo ${haochide[@]:1} hongshaorou gongbaojiding jiangzhouzi 向非稀疏數組中追加元素: ARRAY_NAME[${#ARRAY_NAME[*]}]=VALUE 刪除數組中的元素: unset ARRAY[INDEx] [root@localhost ~]# unset haochide[3] [root@localhost ~]# echo ${haochide[3]} [root@localhost ~]# echo ${haochide[2]} gongbaojiding [root@localhost ~]# 關聯數組: declare -A ARRAY_NAME ARRAY_NAME=([index_name1]="value1" [index_name2]="value2"...)
bash的內置字符串處理工具:
${#var}:返回字符串變量var的長度 [root@localhost ~]# echo ${var[*]} abcdefghijklmnopqrstuvwxyz [root@localhost ~]# echo ${#var} 26
字符串切片:
${var:offset:number} 取字符串的子串 [root@localhost ~]# echo ${var:3:5} defgh 取字符的最右側的幾個字符:${var: -length}::冒號后面跟一個空格 [root@localhost ~]# echo ${var: -5} vwxyz 兩個結合使用的話就是跳過offset所包括的字符,到去掉-length的字符 [root@localhost ~]# echo ${var:5: -5} fghijklmnopqrstu
基于模式取字符串:
${var#*word}:其中Word是指定的分隔符: 功能:自左而右,查找var變量所存儲的字符串中,第一次出現的Word分隔符,刪除字符串開頭至此分隔符之間的所有字符; [root@localhost ~]# echo ${var#*h} ijklmnopqrstuvwxyz ${var##*word}:其中Word是指定的分隔符: 功能:自左而右,查找var變量所存儲的字符串中,最后一次出現的Word分隔符,刪除字符串開頭至此分隔符之間的所有字符; [root@localhost ~]# echo $var abcdefgfggggggfadvk [root@localhost ~]# echo ${var##*f} advk 可以用這個方法取基名: [root@localhost ~]# file="/etc/init.d/functions" [root@localhost ~]# echo ${file##*/} functions ${var%word*}:其中Word是指定的分隔符: 功能:自右而左,查找var變量所存儲的字符串中,第一次出現的Word分隔符,刪除字符串尾部至此分隔符之間的所有字符; ${var%word*}:其中Word是指定的分隔符: 功能:自右而左,查找var變量所存儲的字符串中,最后一次出現的Word分隔符,刪除字符串尾部至此分隔符之間的所有字符;
查找替換:
${var/PATTERN/SUBSTI}:查找var所表示的字符串中,第一次被PATTERN所匹配到的字符串,將其替換為SUBSTI所表示的字符串; [root@localhost ~]# echo $mantou maozidacongyoumodacongdoubanjiangdacong [root@localhost ~]# echo ${mantou/dacong/yangcong} maoziyangcongyoumodacongdoubanjiangdacong ${var//PATTERN/SUBSTI}:查找var所表示的字符串中,所有被PATTERN所匹配到的字符串,將其全部替換為SUBSTI所表示的字符串; [root@localhost ~]# echo $mantou maozidacongyoumodacongdoubanjiangdacong [root@localhost ~]# echo ${mantou//dacong/yangcong} maoziyangcongyoumoyangcongdoubanjiangyangcong ${var/#PATTERN/SUBSTI}:查找var所表示的字符串中,行首被PATTERN所匹配到的字符串,將其替換為SUBSTI所表示的字符串; [root@localhost ~]# echo ${mantou/#maozi/baozi} baozidacongyoumodacongdoubanjiangdacong ${var/%PATTERN/SUBSTI}:查找var所表示的字符串中,行尾被PATTERN所匹配到的字符串,將其替換為SUBSTI所表示的字符串; [root@localhost ~]# echo ${mantou/%dacong/dasuan} maozidacongyoumodacongdoubanjiangdasuan 注意:PATTERN中使用glob風格的通配符 [root@localhost ~]# echo ${mantou/maozi*youmo/dasuan} dasuandacongdoubanjiangdacong 查找刪除: ${var/PATTERN}::以PATTERN為模式查找var字符串中第一次匹配到的字符,并刪除; ${var//PATTERN}:以PATTERN為模式查找var字符串中所有匹配到的字符,并刪除; ${var/#PATTERN} ${var/%PATTERN} 字符大小寫轉換: ${var^^}:把var中的所有小寫字符轉換為大寫; ${var,,}:把var中的所有大寫字符轉換為小寫; 變量賦值: ${var:-VALUE}:如果變量var為空或未設置,那么返回value;否則返回var變量的值; ${var:=VALUE}:如果變量var為空或未設置,那么返回value,并將VALUE賦給var;否則返回var變量的值; ${var:+VALUE}:如果var變量不空,則返回value; ${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} 示例: [root@localhost tmp]# v1=v2 [root@localhost tmp]# v2=nihaoa [root@localhost tmp]# eval v3=\$$v1 [root@localhost tmp]# echo $v3 nihaoa [root@localhost tmp]# echo ${!v1} nihaoa
eval 命令
eval 命令將會首先掃描命令行中所有的變量然后進行所有變量的置換,然后再執行該命令。該命令適用于那些一次掃描無法實現其功能的變量。該命令對變量進行兩次掃描。 示例: [root@localhost tmp]# a=whoami [root@localhost tmp]# echo $a whoami [root@localhost tmp]# `echo $a` root [root@localhost tmp]# eval $a root
創建臨時文件
mktemp命令: 創建的臨時文件可避免沖突 mktemp [OPTION]... [TEMPLATE] TEMPLATE: filename.XXX X 至少要出現三個 OPTION: : -d: 創建臨時目錄 -p DIR或--tmpdir=DIR:指明臨時文件所存放目錄位置 示 例 : #mktemp /tmp/test.XXX #tmpdir=`mktemp –d /tmp/testdir.XXX` #mktemp --tmpdir=/testdir test.XXXXXX
安裝復制文件
install 命令: install [OPTION]... [-T] SOURCE DEST 單文件 install [OPTION]... SOURCE... DIRECTORY install [OPTION]... -t DIRECTORY SOURCE... install [OPTION]... -d DIRECTORY...創建空目錄 選項: -m MODE ,默認755 -o OWNER -g GROUP
bash 如何展開命令行
把命令行分成單個命令詞 展開別名 展開大括號種的聲明({}) ) 展開波浪符聲明(~) ) 命令替換$() 和 ``) ) 再次把命令行分成命令詞 展開文件通配(* 、? 、[abc] 等等) 準備I/0 重導向(< 、>) ) 運行命令 反斜線(\ )會使隨后的字符按原意解釋 $ echo Your cost: \$5.00 Your cost: $5.00加引號來防止擴展 ? 單引號(’ )防止所有擴展 ? 雙引號(”)也防止所有擴展,但是以下情況例外: $ (美元符號) - 變量擴展 ` (反引號) - 命令替換 \ (反斜線) - 禁止單個字符擴展 ! (嘆號) - 歷史命令替換 作業: 輸入若干個數值存入數組中,采用冒泡算法進行升序或降序排序
運行后結果是:
原創文章,作者:dxkboke,如若轉載,請注明出處:http://www.www58058.com/39703