linux下${}、$()、$[]、$(())、[]、[[]]、(())的作用及用法说明

这篇具有很好参考价值的文章主要介绍了linux下${}、$()、$[]、$(())、[]、[[]]、(())的作用及用法说明。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在linux下,特别是shell脚本中,我们经常会遇到${}、$()、$[]、$(())、[]、[[]]、(()),眼花之凌乱,让我们傻傻分不清,下面就为大家讲解一下它们的作用及主要用法

1.${}

首先,当${}用来引用变量时,其等价于$,只不过${}可以指定变量边界

[root@rhel77 yum]# a=123
[root@rhel77 yum]# b=$a
[root@rhel77 yum]# echo $b
123
[root@rhel77 yum]# b=${a}
[root@rhel77 yum]# echo $b
123
[root@rhel77 yum]# 

其次,${}可以用来对字符串进行截取及替换处理

字符串截取及替换处理
变量设定方式 说明
${string#substring} 从$string的开头位置截掉最短匹配的$substring
${string##substring} 从$string的开头位置截掉最长匹配的$substring
${string%substring} 从$string的结尾位置截掉最短匹配的$substring
${string%%substring} 从$string的结尾位置截掉最长匹配的$substring
${string/substring/replacement} 使用$replacement来替换第一个匹配的$substring
${string//substring/replacement} 使用$replacement来替换所有匹配的$substring
${string/#substring/replacement} 如果$substring匹配$string的开头部分, 那么就用$replacement来替换$substring
${string/%substring/replacement} 如果$substring匹配$string的结尾部分, 那么就用$replacement来替换$substring

E.g:

${string#substring}         -->从$string的开头位置截掉最短匹配的$substring

[root@rhel77 ~]# test=xyzXYZ123456xyzXYZ
[root@rhel77 ~]# echo ${test#x*Z}
123456xyzXYZ
[root@rhel77 ~]# 

${string#substring}         -->从$string的开头位置截掉最长匹配的$substring

[root@rhel77 ~]# test=xyzXYZ123456xyzXYZ
[root@rhel77 ~]# echo ${test##x*Z}

[root@rhel77 ~]# 

${string%substring}        -->从$string的结尾位置截掉最短匹配的$substring

[root@rhel77 ~]# test=xyzXYZ123456xyzXYZ
[root@rhel77 ~]# echo ${test%x*Z}
xyzXYZ123456
[root@rhel77 ~]# 

${string%%substring}        -->从$string的结尾位置截掉最长匹配的$substring

[root@rhel77 ~]# test=xyzXYZ123456xyzXYZ
[root@rhel77 ~]# echo ${test%%x*Z}

[root@rhel77 ~]# 

${string/substring/replacement}        -->使用$replacement来替换第一个匹配的$substring

[root@rhel77 ~]# test=xyzXYZ123456xyzXYZ
[root@rhel77 ~]# echo ${test/xyz/ztj}
ztjXYZ123456xyzXYZ
[root@rhel77 ~]# 

${string//substring/replacement}        -->使用$replacement来替换所有匹配的$substring

[root@rhel77 ~]# test=xyzXYZ123456xyzXYZ
[root@rhel77 ~]# echo ${test//xyz/ztj}
ztjXYZ123456ztjXYZ
[root@rhel77 ~]# 

${string/#substring/replacement}        -->如果$substring匹配$string的开头部分, 那么就用$replacement来替换$substring

[root@rhel77 ~]# echo ${test/#xyz/ztj}
ztjXYZ123456xyzXYZ
[root@rhel77 ~]# 

${string/%substring/replacement}        -->如果$substring匹配$string的结尾部分, 那么就用$replacement来替换$substring

[root@rhel77 ~]# test=xyzXYZ123456XYZxyz
[root@rhel77 ~]# echo ${test/%xyz/ztj}
xyzXYZ123456XYZztj
[root@rhel77 ~]# 注意上下对比
[root@rhel77 ~]# test=xyzXYZ123456xyzXYZ
[root@rhel77 ~]# echo ${test/%xyz/ztj}
xyzXYZ123456xyzXYZ
[root@rhel77 ~]# 

第三,${}也可以对变量进行判断赋值--了解即可,很少使用

变量赋值判断
变量设定方式 说明
${parameter-default} 如果变量parameter没被声明, 那么就使用默认值
${parameter:-default} 如果变量parameter没被设置, 那么就使用默认值
${parameter+alt_value} 如果变量parameter被声明了, 那么就使用alt_value, 否则就使用null字符串
${parameter:+alt_value} 如果变量parameter被设置了, 那么就使用alt_value, 否则就使用null字符串
${parameter=default} 如果变量parameter没声明, 那么就把它的值设为default
${parameter:=default} 如果变量parameter没设置, 那么就把它的值设为default
${parameter?err_msg} 如果parameter已经被声明, 那么就使用设置的值, 否则打印err_msg错误消息
${parameter:?err_msg} 如果parameter已经被设置, 那么就使用设置的值, 否则打印err_msg错误消息

对于${parameter-default}和${parameter:-default}、${parameter+alt_value}和${parameter:+alt_value}、${parameter=default}和${parameter:=default}、${parameter?err_msg}和${parameter:?err_msg},99.99%情况下,${parameter-default}和${parameter:-default}、${parameter+alt_value}和${parameter:+alt_value}、${parameter=default}和${parameter:=default}、${parameter?err_msg}和${parameter:?err_msg}绝大多数情况下,输出都是一样的。只有在parameter被声明并设置为null值的时候, 多出来的:才会引起这两种形式的不同。

最后,${}也可以获取变量长度

定义数组:

ztj=(ab cd ef ghij123)

[root@rhel77 ~]# ztj=(ab cd ef ghij123)    -定义数组
[root@rhel77 ~]# echo ${ztj[@]}            -输出数组全部元素
ab cd ef ghij123
[root@rhel77 ~]# echo ${ztj[*]}            -输出数组全部元素
ab cd ef ghij123
[root@rhel77 ~]# 
[root@rhel77 ~]# echo ${ztj[0]}            -输出数组第一个元素,默认数组下标从0开始
ab
[root@rhel77 ~]# echo ${#ztj[@]}           -统计数组元素的个数
4
[root@rhel77 ~]# echo ${#ztj[*]}           -统计数组元素的个数
4
[root@rhel77 ~]# echo ${#ztj[3]}           -计算数组第四个元素的长度,即:ghij123的长度
7
[root@rhel77 ~]# ztj[0]=ztj                -将数组第一个元素的数值重新赋值为ztj
[root@rhel77 ~]# echo ${ztj[@]}            -输出数组全部元素进行验证
ztj cd ef ghij123
[root@rhel77 ~]# 

2.$()

在linux中,$()是用来做命令替换的,其等价于``(反引号)。但是在shell脚本,我们一般使用$(),以增加脚本的可读性

[root@rhel77 ~]# echo $(date +%Y%m%d)
20230706
[root@rhel77 ~]# echo `date +%Y%m%d`
20230706
[root@rhel77 ~]# 

例外:

1.``(反引号)不能多次嵌套使用,否则会有异常问题

E.g:

[root@rhel77 ~]# echo ztj `echo test ` echo date is `date +%Y%m%d```
ztj test echo date is 20230706      ---echo date异常输出
[root@rhel77 ~]# 

2.$()可以多次嵌套使用,而不会有问题

[root@rhel77 ~]# echo ztj $(echo test $( echo date is $(date +%Y%m%d)))
ztj test date is 20230706             ---echo date正常输出
[root@rhel77 ~]# 

3.``(反引号)和$()虽然可以混合使用,但是可读性较差,不建议使用

[root@rhel77 ~]# echo ztj `echo test $( echo date is $(date +%Y%m%d))`
ztj test date is 20230706
[root@rhel77 ~]# 

3.$[]

在linux中,$[]是用来进行数学运算的,其等价于$(()),支持+-*/%,并且在使用中变量可以不使用$,直接使用变量名即可

[root@rhel77 ~]# echo $[1+2]
3
[root@rhel77 ~]# a=1
[root@rhel77 ~]# b=2
[root@rhel77 ~]# echo $[a+b]
3
[root@rhel77 ~]# echo $[$a+$b]
3
[root@rhel77 ~]# 

4.$(())

在linux中,$(())是用来进行数学运算的,其等价于$[],支持+-*/%,并且在使用中变量可以不使用$,直接使用变量名即可

[root@rhel77 ~]# echo $((1+2))
3
[root@rhel77 ~]# a=1
[root@rhel77 ~]# b=2
[root@rhel77 ~]# echo $((a+b))
3
[root@rhel77 ~]# echo $(($a+$b))
3
[root@rhel77 ~]# 

5.[]

在linux中,[]用于判断表达式的是0或非0,以决定程序的执行顺序,其等价于test命令(几乎不常用)

-->逻辑判断

[root@rhel77 ~]# [ ! -d ztj ] && mkdir ztj     --目录ztj不存在,则进行创建
[root@rhel77 ~]# ls -ld ztj
drwxr-xr-x 2 root root 6 Jul  6 10:04 ztj
[root@rhel77 ~]# 

-->if命令判断

[root@rhel77 ~]# {
> a=java
> if test $a == "linux"
> then
> echo "i am linux"
> elif [ $a == "java" ] 
> then
> echo "i am java"
> fi
> }
i am java
[root@rhel77 ~]# {
> a=linux
> if test $a == "linux"
> then
> echo "i am linux"
> elif [ $a == "java" ] 
> then
> echo "i am java"
> fi
> }
i am linux
[root@rhel77 ~]# 

6.[[]]

在linux中,[[]]是[]的增强版,其返回值也是0或者非0,并且,在[[ ]]中使用> 、< 等符号不需要转义

[root@rhel77 ~]# {
> a=4
> if [ $a \> 5 ]
> then
>         echo "$a的值大于5"
> else
>         echo "$a的值小于5"
> fi
> }
4的值小于5
[root@rhel77 ~]# 
[root@rhel77 ~]# {
> a=4
> if [[ $a > 5 ]]
> then
>         echo "$a的值大于5"
> else
>         echo "$a的值小于5"
> fi
> }
4的值小于5
[root@rhel77 ~]# 

另外:

-->[[]]支持&&和||,也支持==和!=和=~的连接或组合判断(但是不支持>、<、>=、<=等)

[root@rhel77 ~]# {
> a=1
> if [[ $a != 4 && $a != 5 ]] 
> then
> echo "hello i am ztj"
> fi
> }
hello i am ztj
[root@rhel77 ~]# 
[root@rhel77 ~]# {
> a=1
> if [[ $a != 4 ]] && [[ $a != 5 ]] 
> then
> echo "hello i am ztj"
> fi
> }
hello i am ztj
[root@rhel77 ~]# 
[root@rhel77 ~]# {
> a=1
> if [ $a != 4 -a  $a != 5 ]
> then
> echo "hello i am ztj"
> fi
> }
hello i am ztj
[root@rhel77 ~]# 
[root@rhel77 ~]# {
> arch_version=$(arch)
> os_version=$(cat /etc/redhat-release)
> echo $os_version
> 
> if [[ "$arch_version" == "x86_64" ]] &&  [[ "$os_version" =~ "Red Hat Enterprise Linux Server release 7.7 (Maipo)" ]]
> then
>      echo "OS is ok"
> fi
> }
Red Hat Enterprise Linux Server release 7.7 (Maipo)
OS is ok
[root@rhel77 ~]# 

-->[[ ]]在比较字符串支持正则匹配和通配符匹配,比如:在[[ ]]中进行 == 或者 != 或=~比较时可以进行通配符匹配

[root@rhel77 ~]# {
> a=linux
> if [[ $a == li* ]]
> then
> echo "hello i am ztj"
> fi
> }
hello i am ztj
[root@rhel77 ~]# 
[root@rhel77 ~]# {
> arch_version=$(arch)
> os_version=$(cat /etc/redhat-release)
> echo $os_version
> 
> if [[ "$arch_version" == "x86_64" ]] &&  [[ "$os_version" =~ ^"Red Hat Enterprise Linux Server release 7".* ]]
> then
>      echo "OS is ok"
> fi
> }
Red Hat Enterprise Linux Server release 7.7 (Maipo)
OS is ok
[root@rhel77 ~]# 

7.(())

在linux中,(())除了结合$进行数学运算之外,还可以用于for或while循环命令中控制循环,类似于c语言,当改变变量的值时,且不需要使用$文章来源地址https://www.toymoban.com/news/detail-606233.html

[root@rhel77 ~]# {
> for((i=1;i<5;i++))
> do
>         echo "this is $i"
> done
> }
this is 1
this is 2
this is 3
this is 4
[root@rhel77 ~]# 
[root@rhel77 ~]# {
> i=0
> while [ $i -le 5 ]
> do
>         echo "this is $i"
>         ((i++))
> done
> }
this is 0
this is 1
this is 2
this is 3
this is 4
this is 5
[root@rhel77 ~]# 
[root@rhel77 ~]# {
> i=0
> while [ $i -le 5 ]
> do
>         echo "this is $i"
>         ((i=i+1))
> done
> }
this is 0
this is 1
this is 2
this is 3
this is 4
this is 5
[root@rhel77 ~]# 
[root@rhel77 ~]# {
> i=0
> while [ $i -le 5 ]
> do
>         echo "this is $i"
>         ((++i))
> done
> }
this is 0
this is 1
this is 2
this is 3
this is 4
this is 5
[root@rhel77 ~]# 

到了这里,关于linux下${}、$()、$[]、$(())、[]、[[]]、(())的作用及用法说明的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux下${}、$()、$[]、$(())、[]、[[]]、(())的作用及用法说明

    在linux下,特别是shell脚本中,我们经常会遇到${}、$()、$[]、$(())、[]、[[]]、(()),眼花之凌乱,让我们傻傻分不清,下面就为大家讲解一下它们的作用及主要用法 首先,当${}用来引用变量时,其等价于$,只不过${}可以指定变量边界 其次,${}可以用来对字符串进行截取及替换处

    2024年02月15日
    浏览(21)
  • 【Linux运维】shell脚本检查服务器内存和CPU利用率

    在管理服务器时候写了一个 shell脚本,在服务上实现每天凌晨3点查系统的指定文件夹下的容量大小,如果超过10G就要删除3天前的内容,还要时刻查询内存和cpu利用率,如果超过80%就要提示用户出现过载 将以上代码保存为一个.sh文件,然后通过crontab在每天凌晨3点运行即可:

    2024年02月09日
    浏览(65)
  • 学习Linux的注意事项(使用经验;目录作用;服务器注意事项)

    本篇分享学习Linux过程中的一些经验 Linux严格区分大小写 Linux中所有内容以文件形式保存 ,包括硬件,Linux是以管理文件的方式操作硬件 硬盘文件是 /dev/sd[a-p] 光盘文件是 /dev/sr0 等 对于设置需要写入文件,命令行的设置在重启之后就会失效,只有下入文件才可以保存下来 文

    2024年02月11日
    浏览(69)
  • Linux本地部署1Panel服务器运维管理面板并实现公网访问

    1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器,包括主机监控、文件管理、数据库管理、容器管理等 下面我们介绍在Linux 本地安装1Panel 并结合cpolar 内网穿透工具实现远程访问1Panel 管理界面 执行如下命令一键安装 1Panel: 安

    2024年02月04日
    浏览(92)
  • Linux服务器常见运维性能测试(1)综合跑分unixbench、superbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月04日
    浏览(75)
  • 【Linux服务器】 .bashrc设置永久环境变量后不起作用的问题

            在使用vi打开.bashrc文件以后设置环境变量         然而发现设置了以后不起作用。这时候可以在终端界面使用export命令查看当前所有的PATH变量,我的情况是只出现了一条,别的都没有,这就说明在配置环境变量的过程中有一条配置语句将其他的PATH变量全部覆

    2024年02月02日
    浏览(48)
  • [1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

    本期测评试用一下1Panel这款面板。1Panel是国内飞致云旗下开源产品。整个界面简洁清爽,后端使用GO开发,前端使用VUE的Element-Plus作为UI框架,整个面板的管理都是基于docker的,想法很先进。官方还提供了视频的使用教程,本期为大家按照本专栏的基本内容进行多方面的测评。

    2024年02月07日
    浏览(89)
  • Redis持久化说明及其单台Linux服务器搭建Redis集群架构

    说明:RDB快照主要以二进制文件的形式进行存储数据,主要以文件名dump.rdb进行存储,主要设置redis.conf里面设置’save 60 1000’命令可以开启, 表示在60秒内操作1000次进行一次备份数据。在客户端执行save(同步)和bgsave(异步操作)。 redis.conf 启动redis相关命令 说明:主要把文件生

    2024年02月10日
    浏览(56)
  • 华为云云耀云服务器L实例评测 | Linux系统宝塔运维部署H5游戏

    本章节内容,我们主要介绍华为云耀服务器L实例,从云服务的优势讲起,然后讲解华为云耀服务器L实例资源面板如何操作,如何使用宝塔运维服务,如何使用运维工具可视化安装nginx,最后部署一个自研的H5的小游戏(6岁的小朋友玩的很开心😁)。 前端的同学如果想把自己

    2024年02月07日
    浏览(56)
  • Linux服务器常见运维性能测试(3)CPU测试super_pi、sysbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月02日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包