bash shell 中的擴展--參數和變數擴展

火星人 @ 2014-03-08 , reply:0


bash shell 中的擴展--參數和變數擴展
----正在學習shell,途中做些筆記,整理整理,方便以後翻閱.---- ---- RHEL_6.2_x64,GNU bash version 4.1.2(1)-release ----
總述: shell 中有七種類型的擴展,他們分別是:花括弧擴展(brace expansion)、波浪線擴展(tilde expansion)、參數和變數擴展(parameter and variable expansion)、命令替換(command substitution)、算術擴展(arithmetic expansion)、詞的拆分(word splitting)和路徑擴展(pathname expansion). 進程替換(process substitution)只有在個別支持的系統中有.擴展的順序是:花括弧擴展,波浪線擴展,參數,變數和算術擴展還有命令替換(按照從左到右的順序),詞的拆分,最后是路徑擴展.
下面是shell擴展中的--參數和變數擴展(parameter and variable expansion): 1)${parameter} 拓展為變數的值.一是為了擴展一個大於9的位置參數,如:${10}.二是為了在變數后直接跟字元串時,不會把字元串看成變數名的一部分,如:${ver}sion. 間接引用.作為bash 2版本的一個主要升級內容,利用${!variable}可間接引用變數,比evel var1=\$$var2高級了.

2)子串削除.單一符號是最小匹配;兩個符號是最大匹配.pattern中的*(星號)統配所有字元. ${parameter#pattern} ${parameter##pattern} 從parameter的開頭位置截掉匹配的pattern.如: parameter=/dir1/dir2/dir3/my.file.txt ${parameter#*/}: 去掉從開頭到第一個 / 的所有字元串:dir1/dir2/dir3/my.file.txt ${parameter##*/}: 去掉從開頭到最后一個 / 的所有字元串:my.file.txt ${parameter#/*.}: 去掉從開頭到第一個 . 的所有字元串:file.txt ${parameter##/*.}: 去掉從開頭到最后一個 . 的所有字元串:txt 注意:#之後開始截取的地方是字元串的第一個字元,在這裡是 / ,或者用一個星號統配標誌字元到開頭所有.若標誌字元在字元串中有多個,##最大匹配直到parameter中最靠後的一個pattern. ${parameter%pattern} ${parameter%%pattern} 從parameter的結尾位置截掉匹配的pattern.如:

parameter=/dir1/dir2/dir3/my.file.txt ${parameter%/*}: 去掉最后條 / 及其右邊的字元串:/dir1/dir2/dir3 ${parameter%%/*}:去掉第一條 / 及其右邊的字元串:(空值) ${parameter%.*t}: 去掉最后一個 . 及其右邊的字元串:/dir1/dir2/dir3/my.file ${parameter%%.*t}:去掉第一個 . 及其右邊的字元串:/dir1/dir2/dir3/my 注意:%之後開始截取的地方是字元串的最后一個字元,在這裡是 t ,或者用一個星號統配標誌字元到結尾所有.若標誌字元在字元串中有多個,%%最大匹配直到parameter中最靠前的一個pattern.
3)子串提取. ${parameter:offset},在$parameter中從位置offset處開始提取到最后.如: ${parameter:5}:提取從第五個字元到最后:/dir2/dir3/my.file.txt ${parameter:(-3)}:提取從倒數開始的3個字元:txt,用括弧括起來,轉義位置這個參數. ${parameter: -8}:提取從倒數開始的8個字元:file.txt,負號前面有個空格,轉義位置這個參數.

${parameter:offset:length},在$parameter中從位置offset開始提取length長度的子串,不包括第offset個.如: ${parameter:0:5}:提取最左邊的 5 個位元組:/dir1 ${parameter:5:5}:提取第 5 個位元組右邊的連續 5 個位元組:/dir2
4)根據變數狀態賦值.利用 ${ } 可針對不同的變數狀態賦值.(未定義、空值、非空值). ${var-string} 若變數var未定義,則用string作傳回值.(空值及非空值時返回變數var值) ${var:-string} 若變數var未定義或為空,則用string作傳回值,var本身的值不變.(非空值時返回變數var值) ${var=string} 若變數var未定義,則用string作傳回值,同時把string值賦給變數var.(空值及非空值時返回變數var值) ${var:=string} 若變數var未定義或為空,則用string作傳回值,同時把string值賦給變數var.(非空值時返回變數var值) ${var string} 若變數var為空或非空值,均使用string作傳回值,var本身的值不變.(未定義時返回變數var值)

${var: string} 若變數var為非空值,則用string作傳回值,var本身的值不變.(未定義或空值時返回變數var值) ${var?string} 若變數var未定義,則把string輸出到並准錯誤中,並從腳本中退出. (空值及非空值時返回變數var值) ${var:?string} 若變數var未定義或為空,則把string輸出到標準錯誤中,並從腳本中退出.可利用此特性來檢查是否設置了變數的值.(非空值時返回變數var值)
5)模式替換:${parameter/pattern/string}.如: ${parameter/dir/path}:將第一個 dir 替換為 path:/path1/dir2/dir3/my.file.txt ${parameter//dir/path}:將全部 dir 替換為 path:/path1/path2/path3/my.file.txt ${parameter/#/dir/-path}:如果開頭匹配 /dir 那就把開頭替換成-path:-path/dir2/dir3/my.file.txt ${parameter/%txt/doc}:如果結尾匹配 txt 那就把結尾替換成 doc:/dir1/dir2/dir3/my.file.doc

${@/txt/doc}或${*/txt/doc}:如果parameter是@或*,此時會輪詢替換所有的位置參數的pattern為string,並列出所有結果.如果parameter數組的下標是@或*,則會輪詢替換所有的數組內容的pattern為string,並列出所有的結果.
6)變數長度和個數 ${#parameter} 表示變數值的長度.如: string=string.txt;echo${#string} 可得到 10. ${#*}和${#@} 表示位置參數的個數 ${#array[*]}和${#array[@]} 表示數組中元素的個數
7)變數大小寫轉換:${parameter^patten}或${parameter^^patten}和${parameter,patten}或${parameter,,patten} ${parameter^patten}轉換變數開頭的第一個字元為大寫.兩個^^號則轉換變數中所有匹配的單個字元.

②${parameter,patten}轉換變數開頭的第一個字元為小寫.兩個,,號則轉換變數中所有匹配的單個字元. 如果parameter是*或者@,則轉換所有位置參數開頭第一個或者是所有匹配的字元,並列出清單. 如果parameter是array[*]或者array[@],則轉換所有數組元素開頭第一個或者是所有匹配的字元,並列出清單. 如果沒有patten部分,則轉換整個parameter為相應的大小寫.
8)位置參數相關 表示9以後的位置參數也需要帶上大括弧,例如${10}、${21}. 利用參數1 2 3 4 5運行腳本,用*或@提取: ${*:2}:提取從第二個開始到最后的參數:2 3 4 5 ${@:2}:同上面一樣:2 3 4 5 ${*:3:3}:提取第3個開始的3個位置參數:3 4 5

大括弧標記法還提供了一種提取從命令行傳遞到腳本的最后一個位置參數的簡單辦法,同時需要用上間接引用就表示為:test=${!#}.
9)匹配變數名:${!prefix*}或${!prefix@}.如: #var1=1;var2=2;var3=3;ttt=4 #echo ${!var*} 結果就是以var開頭的所有變數名:var1 var2 var3
10)列出數組下標:${!name[*]}或${!name@}.如: array=(a asdf afwe gag fddoi wewe);echo ${!array[*]}結果為數組的下標:0 1 2 3 4 5
根據man shell 自己理解逐字翻譯的,可能有個別不到位,作為了解吧!

本文出自 「非同小可」 博客,請務必保留此出處http://xuke1668.blog.51cto.com/2129485/868683





[火星人 via ] bash shell 中的擴展--參數和變數擴展已經有293次圍觀

http://www.coctec.com/docs/linux/show-post-45961.html