shell中各种括号的用法
一、单小括号()
1、将某个命令的返回值作为某个变量的值进行传递
#!/bin/bash USER=$(whoami) echo $USER [root@jump ~]# for i in $(seq 0 4);do echo $i;done 0 1 2 3 4
2、用于初始化数组
array=(1 2 3 4)
二、双小括号(())
1、整数运算(不支持浮点型)
[root@jump ~]# echo $((1+1)) 2
2、进制转换
16进制转10进制 [root@jump ~]# echo $((16#5f)) 95
3、重新定义变量的值
[root@jump ~]# for ((i=0;i<5;i++));do echo $i;done 0 1 2 3 4
4、算数比较
[root@jump ~]# i=5;if (($i>1));then echo "yes";fi yes
三、单中括号[...]
算数比较 [root@jump ~]# i=5;if [ $i -ge 1 ];then echo "yes";fi yes
四、双中括号[[...]]
支持字符串模式匹配,甚至支持正则表达式;使用[[...]]条件判断,能够防止脚本中的许多逻辑错误,比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错; [root@jump ~]# if [[ hello==hell? ]];then echo "yes";fi yes
五、大括号{...}
1、常规用法
for i in {1..4};do echo $i;done #打印1到4的数字; touch {1..4}.txt #创建1.txt 2.txt 3.txt 4.txt文件 touch {1,4}.txt #创建1.txt 4.txt文件
2、变量替换
2.1、${var:-string}和${var:=string}
如果变量var为空,则将string赋值给${var:-string}和${var:=string};
[root@jump ~]# cat aaa.sh #!/bin/bash NUM=$1 if [ ${NUM:="1"} -gt 10 ];then echo "比10大" else echo "比10小" fi echo "输入值为:"${NUM:-"1"} [root@jump ~]# bash aaa.sh 比10小 输入值为:1 [root@jump ~]# bash aaa.sh 55 比10大 输入值为:55
2.2、${var:+string}
变量var不为空的时候,才将string赋值给${var:+string};
2.3、${var:?string}
变量为空的时候,则把string输出到标准错误中,并从脚本中退出;
[root@jump ~]# cat str.sh #!/bin/bash NUM=$1 if [ ${NUM:?"1"} -gt 10 ];then echo "比10大" else echo "比10小" fi [root@jump ~]# bash str.sh str.sh:行3: NUM: 1 [root@jump ~]# bash str.sh 3 比10小
2.4、模式匹配
# 是去掉左边 % 是去掉右边 #和%中的单一符号是最小匹配,两个相同符号是最大匹配。 [root@jump ~]# var="hello word" [root@jump ~]# echo $var hello word [root@jump ~]# echo ${var%o*d} hello w [root@jump ~]# echo ${var%%o*d} hell [root@jump ~]# echo ${var#?e} llo word [root@jump ~]# echo ${var##?e} llo word [root@jump ~]# echo ${var##*e} llo word [root@jump ~]# echo ${var##*s} hello word [root@jump ~]# echo ${var##*d} [root@jump ~]# echo ${var##*r} d [root@jump ~]# echo ${var##hello} word
以上操作都不会改变variable的值,其中,只有在pattern中使用了*匹配符号时,%和%%,#和##才有区别。结构中的pattern支持通配符,*表示零个或多个任意字符,?表示仅与一个任意字符匹配,[...]表示匹配中括号里面的字符,[!...]表示不匹配中括号里面的字符。
2.5、字符串的提取和替换
[root@jump ~]# var=/data/nginx [root@jump ~]# echo $var /data/nginx [root@jump ~]# echo ${var:5} /nginx [root@jump ~]# echo ${var: -5} nginx [root@jump ~]# echo ${var: -6} /nginx [root@jump ~]# echo ${var:(-6)} /nginx [root@jump ~]# echo ${var:1:4} data [root@jump ~]# echo ${var/t/a} /daaa/nginx [root@jump ~]# echo ${var/a/o} /dota/nginx [root@jump ~]# echo ${var//a/o} /doto/nginx
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!