標籤:字串處理
shell編程之字串處理
在 shell 中,由於是一種弱類型的語言,在沒有事先申明變數類型的情況下,所有的變數都是字串。所以對字串的處理就顯得相當重要了。
下面介紹常見的對字串處理的操作。
一、字串切片
${string_var:offest:length},類似於數組元素的提取。
# 這裡的string_var是一個變數,offest 是字串的開始位移量,length是切去字串的長度var=dhcpd:x:177:177:DHCP server:/:/sbin/nologin[[email protected] ~]# echo ${var:6:3}x:1
${string_var:offest}
# 不指定 length 指,預設顯示到最後[[email protected] ~]# echo ${var:6}x:177:177:DHCP server:/:/sbin/nologin
${string_var: -offest}
# 擷取尾部起向前指定長度的字元[[email protected] ~]# echo ${var: -7}nologin
二、擷取子串
1、${string_var#*word}
# 在string_var變數中儲存的子串中,自左向右,尋找第一次出現word,刪除字元開始至此word處的所有內容var=/etc/sysconfig/network-scripts/sysconfig/etc/cmd[[email protected] ~]# echo ${var#*etc}/sysconfig/network-scripts/sysconfig/etc/cmd
2、${string_var#*word}
# 在string_var變數中儲存的子串中,自左向右,尋找第一次出現word,刪除字元開始至此word處的所有內容[[email protected] ~]# echo ${var##*etc}/cmd## 通常情況下同這種方法可以取得一個目錄的基名[[email protected] ~]# echo ${var##*/}cmd
3、${variable%word*}
# 在variable中儲存字串上,自右而左,尋找第一次出現word,刪除此word處至字串尾部的所有內容var=/etc/sysconfig/network-scripts/sysconfig/etc/cmd[[email protected] ~]# echo ${var%etc*}/etc/sysconfig/network-scripts/sysconfig/
4、${variable%%world*}
# 在variable中儲存字串上,自右而左,尋找最後一次出現word,刪除此word處至字串尾部的所有內容;[[email protected] ~]# echo ${var%%etc*}/
三、尋找替換
1、${string_var/pattern/new_string}
# 在string_var字串變數中,自左向右,替換第一次被pattern匹配到的子串為new_stringvar=bash:x:4403:4403::/home/bash:/bin/bash[[email protected] ~]# echo ${var/bash/zsh/}zsh/:x:4403:4403::/home/bash:/bin/bash# 在這裡可以使用檔案萬用字元,像 ? * 等[[email protected] ~]# echo ${var/b??h/zsh/}zsh/:x:4403:4403::/home/bash:/bin/bash# 使用 # 可以錨定變數值首部[[email protected] ~]# echo ${var/%b??h/zsh/}bash:x:4403:4403::/home/bash:/bin/zsh/# 使用 % 可以錨定變數值尾部[[email protected] ~]# echo ${var/#b??h/zsh/}zsh/:x:4403:4403::/home/bash:/bin/bash
2、${string_var//pattern/new_string}
# 在string_var字串變數中,自左向右,替換被pattern匹配到的子串為new_string,匹配到幾次就替換幾次[[email protected] ~]# echo ${var//b??h/zsh/}zsh/:x:4403:4403::/home/zsh/:/bin/zsh/
四、尋找刪除
# 所用的變數如下var=bash:x:4403:4403::/home/bash:/bin/bash
1、${string_var/pattern}
# 在string_var字串變數中,自左向右,替換第一次被pattern匹配到的子串後將其刪除[[email protected] ~]# echo ${var/b??h/}:x:4403:4403::/home/bash:/bin/bash# 同樣可以使用 # 和 % 錨定變數值首部和尾部[[email protected] ~]# echo ${var/%b??h/}bash:x:4403:4403::/home/bash:/bin/
2、${string_var//pattern}
# 在string_var字串變數中,自左向右,替換被pattern匹配到的子串為new_string,匹配到幾次就刪除幾次[[email protected] ~]# echo ${var//b??h/}:x:4403:4403::/home/:/bin/
五、大小寫轉換
1、${string_var^^}
var=var=bash:x:4403:4403::/home/bash:/bin/bash# 將string_var變數中的小寫字母全部轉換為大寫字母[[email protected] ~]# echo ${var^^}BASH:X:4403:4403::/HOME/BASH:/BIN/BASH# 也可以指定那個字元替換大寫,只支援單個字元[[email protected] ~]# echo ${var^^a}bAsh:x:4403:4403::/home/bAsh:/bin/bAsh
2、${string_var,,}
var1=BASH:X:4403:4403::/HOME/BASH:/BIN/BASH# 將string_var變數中的大寫字母全部轉換為小寫字母[[email protected] ~]# echo ${var1,,}bash:x:4403:4403::/home/bash:/bin/bash[[email protected] ~]# echo ${var1,,A}BaSH:X:4403:4403::/HOME/BaSH:/BIN/BaSH
六、變數複製操作
1、${string_var:-value}
# 如果 string_var 變數沒有被set或者變數值為空白的話,就將 string_var 變數值設定為 value。# 但是這個不會改變原來變數的值[[email protected] ~]# name=centos[[email protected] ~]# echo ${name:-redhat}centos[[email protected] ~]# unset name[[email protected] ~]# echo ${name:-redhat}redhat[[email protected] ~]# name=[[email protected] ~]# echo ${name:-redhat}redhat
${string_var-value}
# 如果 string_var 變數沒有被set話,就將 string_var 變數值設定為 value。[[email protected] ~]# name=[[email protected] ~]# echo ${name-redhat}[[email protected] ~]# unset name[[email protected] ~]# echo ${name-redhat}redhat# ${string_var:-value} 與 ${string_var-value}的區別如下:# 在變數值為空白的時候,${string_var-value} 不會被設定為value的值,還是原來的空值
2、${string_var:=value} ${string_var=value}
# ${string_var:=value} 與 ${string_var=value} 如果原來的沒有被 set 或者為空白# 就會將 value的值賦值給 string_var變數# ${string_var:=value} 與 ${string_var=value} 區別如下:[[email protected] ~]# name=[[email protected] ~]# echo ${name=redhat}[[email protected] ~]# echo $name[[email protected] ~]# name=[[email protected] ~]# echo ${name:=redhat}redhat[[email protected] ~]# echo $nameredhat# 當原來的變數值為空白的話,二者有區別,其他一樣,區別如下:# 如果原來的變數值為空白的話:# ${name=redhat} 處理時,保持原來變數的空值# ${name:=redhat} 處理時,會將變數值設定為 redhat
# ${string_var:=value} 和 ${string_var:-value} 表示意義相同,區別如下:[[email protected] ~]# unset name[[email protected] ~]# echo ${name:-redhat}redhat[[email protected] ~]# echo $name[[email protected] ~]# echo ${name:=redhat}redhat[[email protected] ~]# echo $nameredhat# ${string_var:-value} 不會改變原來變數的值# ${string_var:=value} 在執行賦值操作後會改變原來變數的值
3、${string_var:+value}
# 如果 string_var 變數被set或者變數值不為空白的話,就將 string_var 變數值設定為 value。[[email protected] ~]# name=centos[[email protected] ~]# echo ${name:+redhat}redhat
${string_var+value}
# 如果 string_var 變數被set的話,就將 string_var 變數值設定為 value。[[email protected] ~]# name=[[email protected] ~]# echo ${name+redhat}redhat
4、${string_var:?err_msg} ${string_var?err_msg}
# ${string_var?err_msg}, ${string_var:?err_msg}如果 string_var 被 set,那就是用 set 的值,否則 print err_msg.# 這兩種辦法絕大多數時候用法都一樣,只有在 $string_var 被聲明並設定為空白的時候,會有區別#
[[email protected] ~]# debug=[[email protected] ~]# echo ${debug:?err_type1}-bash: debug: err_type1[[email protected] ~]# debug=error1[[email protected] ~]# echo ${debug:?err_type1}error1
七、補充
1、${#var_name}
# 取得var_name變數的長度[[email protected] ~]# name="boy"[[email protected] ~]# echo ${#name}3
總結:本文主要介紹了對字串的相關處理。包括求長度,尋找替換,尋找刪除,大小寫轉換,賦值等的相關操作。當然,這些操作也可以用像grep,sed,awk的文本處理工具完成,但是這些操作是shell內建的功能,執行速度等方面要好於文本處理工具。
本文出自 “逆水寒” 部落格,請務必保留此出處http://guoting.blog.51cto.com/8886857/1534127