Linux 使用shell脚本处理字符串的实现
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
计算VALUE字符串的字符数量
echo ${#name} # 输出结果 13
删除VALUE字符串中以分隔符"."匹配的右侧字符,保留左侧字符
# 非贪婪匹配 echo ${name%y*} # 输出结果 odysee_od # 贪婪匹配 echo ${name%%y*} # 输出结果 od
删除VALUE字符串中以分隔符"."匹配的左侧字符,保留右侧字符
# 非贪婪匹配 echo ${name#*y} # 输出结果 see_odysee # 贪婪匹配 echo ${name##*y} # 输出结果 see
用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
在字符串name中,从位置2开始提取子串(从左到右匹配)
echo ${name:2} # 输出结果 nameisodysee
在字符串name中,从位置2开始提取长度为4的子串(从左到右匹配)
echo ${name:2:4} # 输出结果 name
在字符串name中,从右到左截取8个字符
echo ${name:0-8} # 输出结果 isodysee
在字符串name中,从右到左截取8个字符的前两个
echo ${name:0-8:2} # 输出结果 is
定义变量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
定义变量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"htmlcode">
# 未定义string变量 echo ${string-string 变量未定义} # 输出结果:string 变量未定义 # 定义string变量,但值为空(会返回空值) string= echo ${string-string 变量未定义} # 输出结果为空 # 定义string变量并赋值 string=test echo ${string-string 变量未定义} # 输出结果:test
${string:-DEFAULT}:如果string变量未定义,或者其值为空,返回值为DEFAULT的值,否则返回变量的值
# 未定义string变量 echo ${string:-string 变量未定义} # 输出结果:string 变量未定义 # 定义string变量,但值为空 string= echo ${string:-string 变量值为空} # 输出结果:string 变量值为空 # 定义string变量并赋值 string=test echo ${string:-string 变量值为空} # 输出结果:test
${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
${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
${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
${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
${string"htmlcode">
# 未定义string变量 echo ${string"htmlcode"># 未定义string变量 echo ${string:"color: #ff0000">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 "" # 输出结果 07. 获取从字符串开头到子串的最大长度
# 定义变量string=abc12342341 expr match $string 'abc.*3' # 输出结果 98. 显示匹配的内容
# 定义变量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%"htmlcode">
#!/bin/bash root_usage=$(df -TPh | grep -w "/" | awk '{print $6}') echo ${root_usage%?}
下一篇:shell模糊匹配与正则详解
人们对于笔记本电脑有一个固有印象:要么轻薄但性能一般,要么性能强劲但笨重臃肿。然而,今年荣耀新推出的MagicBook Pro 16刷新了人们的认知——发布会上,荣耀宣布猎人游戏本正式回归,称其继承了荣耀 HUNTER 基因,并自信地为其打出“轻薄本,更是游戏本”的口号。
众所周知,寻求轻薄本的用户普遍更看重便携性、外观造型、静谧性和打字办公等用机体验,而寻求游戏本的用户则普遍更看重硬件配置、性能释放等硬核指标。把两个看似难以相干的产品融合到一起,我们不禁对它产生了强烈的好奇:作为代表荣耀猎人游戏本的跨界新物种,它究竟做了哪些平衡以兼顾不同人群的各类需求呢?