Linux 使用 shell 脚本处理字符串

本文原文链接:https://blog.csdn.net/xzk9381/article/details/110876329

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消息发送到标准错误输出

本文原文链接:https://blog.csdn.net/xzk9381/article/details/110876329

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%?}

本文原文链接:https://blog.csdn.net/xzk9381/article/details/110876329

猜你喜欢

转载自blog.csdn.net/xzk9381/article/details/110876329