Linux 使用 shell 指令碼處理字串

徐似安然Aaron發表於2020-12-08

1. 擷取字串的前8位


expr substr "$string" 1 8
echo $string | awk '{print substr(,1,8)}'
echo $string | cut -c1-8
echo $string | dd bs=1 count=8 2>/dev/null

2. 分割、替換字串


2.1 命令說明

符號釋義
*萬用字元,用於匹配字串將被刪除的子串
.分割符,可以為任意一個或多個字元
%從右向左匹配
#從左向右匹配
/表示替換
% # /非貪婪匹配,即匹配符合萬用字元的最短結果
% ## //貪婪匹配,即匹配符合萬用字元的最長結果
示例含義
${#VALUE}計算VALUE字串的字元數量
${VALUE%.*} 或 ${VALUE%%.*}刪除VALUE字串中以分隔符"."匹配的右側字元,保留左側字元
${VALUE#*.} 或 ${VALUE##*.}刪除VALUE字串中以分隔符"."匹配的左側字元,保留右側字元
${VALUE/OLD/NEW} 或 ${VALUE//OLD/NEW}用NEW子串替換VALUE字串中匹配的OLD子串

2.2 應用例項

定義變數name=odysee_odysee

  1. 計算VALUE字串的字元數量
echo ${#name}			# 輸出結果 13
  1. 刪除VALUE字串中以分隔符"."匹配的右側字元,保留左側字元
# 非貪婪匹配
echo ${name%y*}			# 輸出結果 odysee_od
# 貪婪匹配
echo ${name%%y*}		# 輸出結果 od
  1. 刪除VALUE字串中以分隔符"."匹配的左側字元,保留右側字元
# 非貪婪匹配
echo ${name#*y}			# 輸出結果 see_odysee
# 貪婪匹配
echo ${name##*y}		# 輸出結果 see
  1. 用NEW子串替換VALUE字串中匹配的OLD子串
# 非貪婪匹配
echo ${name/o/O}		#輸出結果 Odysee_odysee

# 貪婪匹配
echo ${name//o/O}		#輸出結果 Odysee_Odysee

3. 字串擷取


3.1 命令說明

示例含義
${VALUE:POSITION}在字串VALUE中,從位置POSITION開始提取子串(從左到右匹配)
${VALUE:POSITION:LENGTH}在字串VALUE中,從位置POSITION開始提取長度為LENGTH的子串(從左到右匹配)
${VALUE:0-OFFSET}在字串VALUE中,從右到左擷取OFFSET個字元
${VALUE:0-OFFSET:LENGTH}在字串VALUE中,從右到左擷取OFFSET個字元的前LENGTH個

3.2 應用例項

定義變數name=mynameisodysee

  1. 在字串name中,從位置2開始提取子串(從左到右匹配)
echo ${name:2}		# 輸出結果 nameisodysee
  1. 在字串name中,從位置2開始提取長度為4的子串(從左到右匹配)
echo ${name:2:4}	# 輸出結果 name
  1. 在字串name中,從右到左擷取8個字元
echo ${name:0-8}	# 輸出結果 isodysee
  1. 在字串name中,從右到左擷取8個字元的前兩個
echo ${name:0-8:2}	# 輸出結果 is
  1. 定義變數string=abc12342341 ,以下為擷取示例
echo ${string:4}      	# 從第4位開始擷取後面所有字串,輸出結果:2342341
echo ${string:3:3}    	# 從第3位開始擷取後面3位,輸出結果:123
echo ${string:3:6}    	#從第3位開始擷取後面6位,輸出結果:123423    
echo ${string: -4}    	#擷取後4位,輸出結果:2341
echo ${string:(-4)}     #同上    
expr substr $string 3 3 #從第3位開始擷取後面3位,輸出結果123 
  1. 定義變數str="abcdef",以下為擷取示例
expr substr "$str" 1 3  # 從第一個位置開始取3個字元,輸出結果:abc  
expr substr "$str" 2 5  # 從第二個位置開始取5個字元,輸出結果:bcdef   
expr substr "$str" 4 5  # 從第四個位置開始取5個字元,輸出結果:def  
echo ${str:2}           # 從第二個位置開始提取字串,輸出結果:bcdef  
echo ${str:2:3}         # 從第二個位置開始提取3個字元,輸出結果:bcd  
echo ${str:(-6):5}      # 從倒數第二個位置向左提取字串,輸出結果:abcde  
echo ${str:(-4):3}      # 從倒數第二個位置向左提取6個字元,輸出結果:cde

4. 判斷變數的值


4.1 命令說明

示例含義
${string-DEFAULT}如果string變數未定義,返回值為DEFAULT的值,否則返回變數的值
${string:-DEFAULT}如果string變數未定義,或者其值為空,返回值為DEFAULT的值,否則返回變數的值
${string=DEFAULT}如果string變數未定義,返回值為DEFAULT的值,並將DEFAULT賦值給string,否則返回變數的值
${string:=DEFAULT}如果string變數未定義,或者其值為空,返回值為DEFAULT的值,
並將DEFAULT賦值給string,否則返回變數的值
${string+DEFAULT}如果string已賦值,其值用DEFAULT替換,否則不進行任何替換
${string:+DEFAULT}如果string已賦值,其值用DEFAULT替換,否則不進行任何替換
${string?ERR_MSG}當變數未被定義時,將ERR_MSG訊息傳送到標準錯誤輸出
${string:?ERR_MSG}當變數未被賦值時,將ERR_MSG訊息傳送到標準錯誤輸出

4.2 應用例項

  1. ${string-DEFAULT}:如果string變數未定義,返回值為DEFAULT的值,否則返回變數的值
# 未定義string變數
echo ${string-string 變數未定義}			# 輸出結果:string 變數未定義

# 定義string變數,但值為空(會返回空值)
string=
echo ${string-string 變數未定義}			# 輸出結果為空

# 定義string變數並賦值
string=test
echo ${string-string 變數未定義}			# 輸出結果:test
  1. ${string:-DEFAULT}:如果string變數未定義,或者其值為空,返回值為DEFAULT的值,否則返回變數的值
# 未定義string變數
echo ${string:-string 變數未定義}		# 輸出結果:string 變數未定義

# 定義string變數,但值為空
string=
echo ${string:-string 變數值為空}		# 輸出結果:string 變數值為空

# 定義string變數並賦值
string=test
echo ${string:-string 變數值為空}		# 輸出結果:test
  1. ${string=DEFAULT}:如果string變數未定義,返回值為DEFAULT的值,並將DEFAULT賦值給string,否則返回變數的值
# 未定義string變數
echo ${string=123}			# 輸出結果:123
echo ${string}				# 輸出結果:123

# 定義string變數,但值為空(會返回空值)
string=
echo ${string=123}			# 輸出結果為空
echo ${string}

# 定義string變數並賦值
string=test
echo ${string=123}			# 輸出結果:test
echo ${string}				# 輸出結果:test
  1. ${string:=DEFAULT}:如果string變數未定義,或者其值為空,返回值為DEFAULT的值,並將DEFAULT賦值給string,否則返回變數的值
# 未定義string變數
echo ${string:=123}			# 輸出結果:123
echo ${string}				# 輸出結果:123

# 定義string變數,但值為空
string=
echo ${string:=123}			# 輸出結果:123
echo ${string}				# 輸出結果:123

#定義string變數並賦值
string=test
echo ${string:=123}			# 輸出結果:test
echo ${string}				# 輸出結果:test
  1. ${string+DEFAULT}:如果string已賦值,其值用DEFAULT替換,否則不進行任何替換
# 未定義string變數
echo ${string+123}			# 輸出結果為空
echo ${string}				# 輸出結果為空

# 定義string變數,但值為空
string=
echo ${string+123}			# 輸出結果:123
echo ${string}				# 輸出結果為空

# 定義string變數並賦值
string=test
echo ${string+123}			# 輸出結果:123
echo ${string}				# 輸出結果:test
  1. ${string:+DEFAULT}:如果string已賦值,其值用DEFAULT替換,否則不進行任何替換
# 未定義string變數
echo ${string:+123}			# 輸出結果為空
echo ${string}				# 輸出結果為空

# 定義string變數,但值為空
string=
echo ${string:+123}			# 輸出結果為空
echo ${string}				# 輸出結果為空

# 定義string變數並賦值
string=test
echo ${string:+123}			# 輸出結果:123
echo ${string}				# 輸出結果:test
  1. ${string?ERR_MSG}:當變數未被定義時,將ERR_MSG訊息傳送到標準錯誤輸出
# 未定義string變數
echo ${string?輸出錯誤資訊}	# 輸出結果:-bash: string: 輸出錯誤資訊
echo ${string}				# 輸出結果為空

# 定義string變數,但值為空
string=
echo ${string?輸出錯誤資訊}	# 輸出結果為空
echo ${string}				# 輸出結果為空

# 定義string變數並賦值
string=test
echo ${string?輸出錯誤資訊}	# 輸出結果:test
echo ${string}				# 輸出結果:test
  1. ${string:?ERR_MSG}:當變數未被賦值時,將ERR_MSG訊息傳送到標準錯誤輸出
# 未定義string變數
echo ${string:?輸出錯誤資訊}	# 輸出結果:-bash: string: 輸出錯誤資訊
echo ${string}				# 輸出結果為空

# 定義string變數,但值為空
string=
echo ${string:?輸出錯誤資訊}	# 輸出結果:-bash: string: 輸出錯誤資訊
echo ${string}				# 輸出結果為空

# 定義string變數並賦值
string=test
echo ${string:?輸出錯誤資訊}	# 輸出結果:test
echo ${string}				# 輸出結果:test

5. 獲取字串長度


# 定義變數string=abc12342341
echo ${#string}			# 輸出結果 11
expr length $string		# 輸出結果 11
expr "$string" : ".*"	# 分號二邊要有空格,這裡的:根match的用法差不多

6. 獲取字串所在位置


# 定義變數str="abc"
expr index $str "a"  # 輸出結果 1  
expr index $str "b"  # 輸出結果 2  
expr index $str "x"  # 輸出結果 0  
expr index $str ""   # 輸出結果 0   

7. 獲取從字串開頭到子串的最大長度


# 定義變數string=abc12342341
expr match $string 'abc.*3'		# 輸出結果 9

8. 顯示匹配的內容


# 定義變數string=abc12342341
expr match $string '\([a-c]*[0-9]*\)'  # 輸出結果 abc12342341    
expr $string : '\([a-c]*[0-9]\)'       # 輸出結果 abc1    
expr $string : '.*\([0-9][0-9][0-9]\)' # 輸出結果 341 顯示括號中匹配的內容  

9. 顯示不匹配的內容


# 定義變數string=abc12342341
echo ${string#a*3}     # 從$string左邊開始,去掉最短匹配子串,輸出結果:42341 
echo ${string#c*3}     # 這樣什麼也沒有匹配到,輸出結果:abc12342341
echo ${string#*c1*3}   # 從$string左邊開始,去掉最短匹配子串,輸出結果:42341  
echo ${string##a*3}    # 從$string左邊開始,去掉最長匹配子串,輸出結果:41
echo ${string%3*1}     # 從$string右邊開始,去掉最短匹配子串,輸出結果:abc12342
echo ${string%%3*1}    # 從$string右邊開始,去掉最長匹配子串,輸出結果:abc12

# 定義變數str="abbc,def,ghi,abcjkl"  
echo ${str#a*c}         # 輸出結果:def,ghi,abcjkl  一個井號(#) 表示從左邊擷取掉最短的匹配 (這裡把abbc字串去掉) 
echo ${str##a*c}        # 輸出結果:jkl             兩個井號(##) 表示從左邊擷取掉最長的匹配 (這裡把abbc,def,ghi,abc字串去掉)  
echo ${str#"a*c"}       # 輸出結果:abbc,def,ghi,abcjkl   因為str中沒有"a*c"子串  
echo ${str##"a*c"}      # 輸出結果:abbc,def,ghi,abcjkl   同理  
echo ${str#*a*c*}       # 輸出結果:空  
echo ${str##*a*c*}      # 輸出結果:空  
echo ${str#d*f}         # 輸出結果:abbc,def,ghi,abcjkl,   
echo ${str#*d*f}        # 輸出結果:ghi,abcjkl     
echo ${str%a*l}         # 輸出結果:abbc,def,ghi          一個百分號(%)表示從右邊擷取最短的匹配   
echo ${str%%b*l}        # 輸出結果:a                     兩個百分號表示(%%)表示從右邊擷取最長的匹配  
echo ${str%a*c}         # 輸出結果:abbc,def,ghi,abcjkl

# 這裡要注意,必須從字串的第一個字元開始,或者從最後一個開始,可以這樣記憶, 井號(#)通常用於表示一個數字,它是放在前面的;百分號(%)解除安裝數字的後面; 或者這樣記憶,在鍵盤佈局中,井號(#)總是位於百分號(%)的左邊(即前面)

10. 去掉字串末尾的字元


使用df -Th獲取磁碟資訊,並將使用率賦給變數來與閾值進行對比,如果存在%號無法進行對比,所以需要去掉變數中的%號,可以使用${var%?}的格式來去掉最後一個字元

#!/bin/bash

root_usage=$(df -TPh | grep -w "/" | awk '{print $6}')
echo ${root_usage%?}

相關文章