Shell腳本編程——字符串變量處理

以下內容轉載自http://183530300.blog.51cto.com/894387/1841659

相信正在腳本之路上狂奔的同學們,都能感覺到腳本中需要應用變量的地方非常廣泛,簡單來看變量也只不過就是:var=value;如果我們深入其 中,也能發現變量裏面的學問其實也挺深的,今天就給大家分享一下這個小小的變量裏面到底有多少的學問吧。Shell變量一般是無類型的,但是bash Shell提供了declare和typeset兩個命令用於指定變量的類型,兩個命令是完全等價的。

一、高級變量用法——定義有類型變量
declare [選項] 變量名
 -r 將變量設置爲只讀屬性  等同於使用export VAR_NAME
 -i 將變量定義爲整型數
 -a 將變量定義爲數組
 -f 顯示此腳本前定義過的所有函數名及其內容
 -F 僅顯示此腳本前定義過的所有函數名
 -x 將變量聲明爲環境變量
 -l  將變量值轉爲小寫字母
 -u  將變量值轉爲大寫字母

 

二、字符串切片:
 1、${#var}:返回字符串變量var的長度
  示例代碼:
  [root@centos7 array]# vara=test12345
  [root@centos7 array]# echo ${vara}
  test12345
  [root@centos7 array]# echo ${#vara}
  9

 2、${var:offset}:返回字符串變量var中從第offset個字符後(不包括第offset個字符)的字符開始,到最後的部分,offset的取值在0 到 ${#var}-1 之間
      (bash4.2後,充許爲負值)
  示例代碼:
  [root@centos7 array]# vara=test12345
  [root@centos7 array]# echo ${vara:4}
  12345

 3、${var:offset:number}:返回字符串變量var中從第offset個字符後(不包括第offset個字符)的字符開始,長度爲number的部分
  示例代碼:
  [root@centos7 array]# vara=test12345
  [root@centos7 array]# echo ${vara:3:4}
  t123

 4、${var: -lengh}:取字符串的最右側幾個字符
     注意:冒號後必須有一空白字符
  示例代碼:
  [root@centos7 array]# vara=test12345
  [root@centos7 array]# echo ${vara: -3}
  345
  [root@centos7 array]# echo ${vara: -5}
  12345

 

三、字符串處理
(一)基於模式取子串:
 1、${var#*word}:自左而右,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串開頭至第一次出現word字符之間的所有字符
  示例代碼:
  [root@centos7 array]# vara=test12345
  [root@centos7 array]# echo ${vara#*12}
  345
  [root@centos7 array]# echo ${vara#*es}
  t12345

 2、${var##*word}:同上,不同的是,刪除的是字符串開頭至最後一次由word指定的字符之間的所有內容
  示例代碼:
  [root@centos7 array]# file=/var/log/messages
  [root@centos7 array]# echo ${file##*/}
  messages

 3、${var%word*}:自右而左,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串最後一個字符向左至第一次出現word字符之間的所有字符
  示例代碼:
  [root@centos7 array]# file=/var/log/messages
  [root@centos7 array]# echo ${file%/*}
  /var/log

 4、${var%%word*}:同上,只不過刪除字符串最右側的字符向左至最後一次出現word字符之間的所有字符
  示例代碼:
  [root@centos7 array]# url=http://www.baidu.com:80
  [root@centos7 array]# echo ${url##*:}
  80
  [root@centos7 array]# echo ${url%%:*}
  http

 

(二)查找替換:
 1、${var/pattern/substi}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substi替換之
  示例代碼:
  [root@centos7 array]# vara=test12345test
  [root@centos7 array]# echo ${vara/es/00}
  t00t12345test

 2、${var//pattern/substi}: 查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substi替換之
  示例代碼:
  [root@centos7 array]# vara=test12345test
  [root@centos7 array]# echo ${vara/es/00}
  t00t12345test
  [root@centos7 array]# echo ${vara//es/00}
  t00t12345t00t

 3、${var/#pattern/substi}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substi替換之
  示例代碼:
  [root@centos7 array]# vara=test12345test
  [root@centos7 array]# echo ${vara/#te/00}
  00st12345test

 4、${var/%pattern/substi}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substi替換之
  示例代碼:
  [root@centos7 array]# vara=test12345test
  [root@centos7 array]# echo ${vara/#te/00}
  00st12345test
  [root@centos7 array]# echo ${vara/%st/000}
  test12345te000

 

(三)查找並刪除:
 1、${var/pattern}:查找var所表示的字符串中,刪除第一次被pattern所匹配到的字符串
  示例代碼:
  [root@centos7 array]# vara=test12345test
  [root@centos7 array]# echo ${vara/12345}
  testtest

 2、${var//pattern}:查找var所表示的字符串中,刪除所有被pattern所匹配到的字符串
  示例代碼:
  [root@centos7 array]# vara=test12345test
  [root@centos7 array]# echo ${vara//t}
  es12345es
  [root@centos7 array]# file=/var/log/messages
  [root@centos7 array]# echo ${file///}
  varlogmessages

 3、${var/#pattern}:查找var所表示的字符串中,刪除行首被pattern所匹配到的字符串
  示例代碼:
  [root@centos7 array]# vara=test12345test
  [root@centos7 array]# echo ${vara/#test}
  12345test
  [root@centos7 array]# file=/var/log/messages
  [root@centos7 array]# echo ${file/#\/var}
  /log/messages
 
 4、${var/%pattern}:查找var所表示的字符串中,刪除行尾被pattern所匹配到的字符串
  示例代碼:
  [root@centos7 array]# file=/var/log/messages
  [root@centos7 array]# echo ${file/%ges}
  /var/log/messa
  [root@centos7 array]# vara=test12345test
  [root@centos7 array]# echo ${vara/%test}
  test12345

 

(四)字符大小寫轉換:
 1、${var^^}:把var中的所有小寫字母轉換爲大寫
  示例代碼:
  [root@centos7 array]# vara=test
  [root@centos7 array]# echo ${vara^^}
  TEST

 2、${var,,}:把var中的所有大寫字母轉換爲小寫
  示例代碼:
  [root@centos7 array]# vara=WANGJUN
  [root@centos7 array]# echo ${vara,,}
  wangjun

 

四、變量賦值高級方式
 1、${var:-value}:如果var爲空或未設置,那麼返回value;否則,則返回var的值
  示例代碼:
  [root@centos7 array]# echo ${varb:-100}
  100

 2、${var:+value}:如果var不空,則返回value
  示例代碼:
  [root@centos7 array]# varb=wangjun
  [root@centos7 array]# echo ${varb:+100}
  100

 3、${var:=value}:如果var爲空或未設置,那麼返回value,並將value賦值給var;否則,則返回var的值
  示例代碼:
  [root@centos7 array]# varb=wangjun
  [root@centos7 array]# echo ${varb:=100}
  wangjun
  [root@centos7 array]# echo ${varc:=100}
  100

 4、${var:?error_info}:如果var爲空或未設置,那麼返回error_info;否則,則返回var的值
  示例代碼:
  [root@centos7 array]# varb=wangjun
  [root@centos7 array]# echo ${varb:?4}
  wangjun
  [root@centos7 array]# echo ${vard:?4}
  -bash: vard: 4

 

 使用配置文件爲腳本程序變量賦值
  (1) 定義文本文件,每行定義“name=value”
  (2) 在腳本中source此文件即可

 

五、間接變量引用
 如果第一個變量的值是第二個變量的名字,從第一個變量引用第二個變量的值就稱爲間接變量引用
 var1=var2
 var2=value
 var1的值是var2,而var2又是變量名,var2的值爲value,間接變量引用是指通過var1獲得變量值value的行爲

 bash Shell提供了兩種格式實現間接變量引用
 eval var3=\$$var1
 var3=${!var1}

  示例代碼:

 [root@centos7 useradmin]# var1=user
 [root@centos7 useradmin]# user=test
 [root@centos7 useradmin]# echo $var1
 user
 [root@centos7 useradmin]# eval var3=\$$var1
 [root@centos7 useradmin]# echo $var3
 test

 [root@centos7 useradmin]# var4=${!var1}
 [root@centos7 useradmin]# echo $var4
 test

 

 eval命令
 eval命令將會首先掃描命令行進行所有的置換,然後再執行該命令。該命令適用於那些一次掃描無法實現其功能的變量。該命令對變量進行兩次掃描
  示例代碼:
 [root@centos7 useradmin]# prefix=user
 [root@centos7 useradmin]# $num
 bash: 005: command not found...
 [root@centos7 useradmin]# num=005
 [root@centos7 useradmin]# eval "echo $prefix{001..$num}"
 user001 user002 user003 user004 user005


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章