shell中常用的变量处理、字符串操作(之三)
参考:http://www.zsythink.net/archives/2311
之前的文章中,我们提到了shell中常用的字符串处理操作,我们来回顾一下
一、获取变量的长度(字符串长度)。
二、对变量值进行截取(截取字符串)。
三、替换变量值中的某段字符。
四、删除变量值中的某段字符。
五、对变量值进行大小写转换。
六、当变量值为空时,对变量进行一些操作。
前两篇文章中,我们已经总结了上述操作中的前四种操作,今天,我们来介绍一下上述操作的最后两种操作,并将之前的所有总结进行一个汇总,以便以后进行回顾。
字符串大小写转换
首先,我们准备一个变量,变量值为字母a到z,只不过a到k为小写,L到Z为大写,如下图所示
1 2 3 4 | [root@node1 ~]# testvar1=$(echo {a..k};echo {L..Z}) [root@node1 ~]# echo $testvar1 a b c d e f g h i j k L M N O P Q R S T U V W X Y Z [root@node1 ~]# |
如果我们想要将变量testvar1中的所有小写英文字母都转换成大写,该怎么办呢?我们可以使用如下方法。
1 2 | [root@node1 ~]# echo ${testvar1^^} A B C D E F G H I J K L M N O P Q R S T U V W X Y Z |
如上图所示,只要在输出变量值时加上"^^"即可,"^"为数字键6对应的符号。
如果想要将变量testvar1中的所有大写英文字母都转换成小写,可以使用如下方法。
1 2 3 | [root@node1 ~]# echo ${testvar1,,} a b c d e f g h i j k l m n o p q r s t u v w x y z [root@node1 ~]# |
如上图所示,只要在输出变量值时加上",,"即可将字母中的大写字符转换成小写,很简单吧~
当变量值为空或者非空时对变量进行操作
在写shell脚本时,我们可能会遇到如下场景。
我们需要判断某个变量是否为空,如果变量值不为空,则使用变量当前的值,如果为空,则赋予变量一个默认值,以便之后进行处理。
那么,在脚本中可能会出现类似如下代码
if [ -z "$testvar" ];then
testvar="test"
fi
如上述代码所示,我们使用 if 结构,判断了变量testvar是否为空,如果为空,则将变量赋值为test,当然,如果变量值不为空,那么则不会被赋值,即保持变量原值不变。
其实,我们可以使用更简单的方法,我们只需要一行代码,就可以代替上例中的三行代码,示例如下
${testvar:="test"}
没错,就是这么简单,上述代码表示,如果变量testvar的值为空,则将testvar赋值为test,如果不为空,则testvar保持原值不变。我们在命令行中试试上述代码的效果,首先,将变量testvar的值设置为空值,然后使用上述语法,如下。
1 2 3 4 5 6 | [root@node1 ~]# testvar= [root@node1 ~]# echo ${testvar:= "abc" } abc [root@node1 ~]# echo ${testvar} abc [root@node1 ~]# |
可以看到,当变量为空时,上述语法不仅会将变量的值设置为指定值,同时还会返回对应的值,我们可以直接使用echo命令进行输出,经过上述语法处理后,再次输出变量,变量已经被赋值。
当变量值不为空时,经过上述语法处理后,只会返回变量的原值,并不会改变变量的值,示例如下
1 2 3 4 5 6 7 | [root@node1 ~]# echo ${testvar} abc [root@node1 ~]# echo ${testvar:= "ttt" } abc [root@node1 ~]# echo ${testvar} abc [root@node1 ~]# |
可以发现,当变量为空时,使用上述语法会返回我们指定的值,同时还会将变量设定为我们指定的值,其实,还有另外一种方法,能够在变量为空时返回我们指定的值,但是不对变量进行赋值,示例如下。
${testvar:-"test"}
细心如你一定发现了,与之前的语法相比,只是语法中的"="替换成了"-"
上述语法表示,如果testvar变量值为空,则返回指定的文本"test",如果testvar变量值不为空,则返回testvar变量本身的值,但是,当testvar变量值为空时,使用上述语法,只会返回指定的值,并不会对变量进行赋值操作,我们在命令行中看一下效果,示例如下。
1 2 3 4 5 6 7 8 9 | [root@node1 ~]# unset testvar [root@node1 ~]# testvar= [root@node1 ~]# echo ${testvar} [root@node1 ~]# echo ${testvar:- "ttt" } ttt [root@node1 ~]# echo ${testvar} [root@node1 ~]# |
可以看到,当变量为空时,上述语法并不会对变量赋值,当变量值不为空时,示例如下。
1 2 3 4 5 6 | [root@node1 ~]# testvar=123 [root@node1 ~]# echo ${testvar:- "ttt" } 123 [root@node1 ~]# echo ${testvar} 123 [root@node1 ~]# |
之前的两个示例,都是在变量为空时,返回我们指定的值,那么能不能在变量不为空时,返回我们指定的值呢?必须能的,使用如下语法即可。
${testvar:+"test"}
上述语法表示,当testvar变量值不为空时,返回指定的字符串"test",如果变量为空,则返回变量本身的值(即空值),示例如下
1 2 3 4 5 6 7 8 9 10 11 12 13 | [root@node1 ~]# testvar=123 [root@node1 ~]# echo $testvar 123 [root@node1 ~]# echo ${testvar:+ "abc" } abc [root@node1 ~]# echo $testvar 123 [root@node1 ~]# unset testvar [root@node1 ~]# echo ${testvar:+ "abc" } [root@node1 ~]# echo $testvar [root@node1 ~]# |
如上图所示,当变量值不为空时,使用上述语法会返回我们指定的值,但是并不会改变变量原来的值,如果变量值为空,使用上述语法,仍然返回空值,同时也不会对变量进行赋值。
我们还可以在变量为空时,输出bash风格的error_info,示例如下
${testvar:?"error_info"}
上述语法表示testvar变量为空时,输出bash错误,错误信息为我们指定的字符串error_info
示例如下
1 2 3 4 | [root@node1 ~]# unset testvar [root@node1 ~]# ${testvar:? "var is null" } -bash: testvar: var is null [root@node1 ~]# |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2019-09-23 Linux之date命令详解