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

相信正在腳本之路上狂奔的同窗們,都能感受到腳本中須要應用變量的地方很是普遍,簡單來看變量也只不過就是:var=value;若是咱們深刻其中,也能發現變量裏面的學問其實也挺深的,今天就給你們分享一下這個小小的變量裏面到底有多少的學問吧。Shell變量通常是無類型的,可是bash Shell提供了declare和typeset兩個命令用於指定變量的類型,兩個命令是徹底等價的。centos

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

 

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

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

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

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

 

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

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

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

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

 

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

 二、${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

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

 四、${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

 

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

 二、${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

 三、${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
 
 四、${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

 

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

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

 

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

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

 三、${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

 四、${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此文件便可

 

5、間接變量引用
 若是第一個變量的值是第二個變量的名字,從第一個變量引用第二個變量的值就稱爲間接變量引用
 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

 正在學習腳本的同窗們,當你看到這兒的同時,有什麼想法嗎,相信曾經的困惑被打開了吧,至少當初我本身學到這兒的時候,豁然開朗。

相關文章
相關標籤/搜索