Linux Shell編程之五字串的處理

來源:互聯網
上載者:User

標籤:字串處理

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.