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语言,当改变变量的值时,且不需要使用$

[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 ~]#

————————————————
版权声明:本文为CSDN博主「小黑要上天」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/z19861216/article/details/131554305

目录
相关文章
|
6月前
|
缓存 Ubuntu 网络协议
Linux系统编程之文件I/O函数的使用:介绍文件I/O函数的基本概念、用法和实现方式
Linux系统编程之文件I/O函数的使用:介绍文件I/O函数的基本概念、用法和实现方式
105 1
|
1月前
|
Ubuntu Linux
Linux的基础用法
Linux的基础用法
20 6
|
2月前
|
监控 Linux
Linux系统中du命令与df命令的区别与用法
总的来说,`du` 和 `df` 在磁盘管理中互补使用,能够提供全面的磁盘空间使用信息,帮助用户和管理员有效地监控和管理系统资源。
61 3
|
2月前
|
存储 Ubuntu Linux
linux中的find 命令详细用法
本文介绍了如何将 `find` 命令与 `exec` 结合使用,通过具体示例展示了多种应用场景,如显示文件属性、重命名文件、收集文件大小、删除特定文件、执行工具、更改文件所有权和权限、收集 MD5 值等。文章还探讨了 `{} \;` 和 `{} +` 的区别,并演示了如何结合 `grep` 命令进行内容搜索。最后,介绍了如何在一个 `find` 命令中使用多个 `exec` 命令。这为 Linux 用户提供了强大的文件管理和自动化工具。
|
3月前
|
存储 运维 监控
运维.Linux下执行定时任务(上:Cron简介与用法解析)
运维.Linux下执行定时任务(上:Cron简介与用法解析)
46 0
|
4月前
|
JavaScript Linux
【详细讲解】Linux grep命令用法大全 片尾有示例搜索指定目录中指定文件后缀的指定字符
【详细讲解】Linux grep命令用法大全 片尾有示例搜索指定目录中指定文件后缀的指定字符
114 1
|
5月前
|
XML Linux API
探索Linux中的dbus-binding-tool:理解其用途与用法
`dbus-binding-tool`是Linux D-Bus工具集的一部分,用于从XML接口描述生成语言绑定代码,简化D-Bus服务在应用程序中的集成。它支持自动代码生成,多种语言(如C、C++、Python),并提供灵活性以适应特定需求。使用步骤包括获取XML描述文件,运行工具生成代码,然后在应用中使用生成的API。注意版本兼容性、错误处理,并参考官方文档和示例以优化使用。该工具助力开发人员高效实现进程间通信和系统服务集成。
|
6月前
|
监控 Linux 数据处理
|
4月前
|
Unix Linux
Linux中grep命令的高级用法与实例
Linux中grep命令的高级用法与实例
|
5月前
|
机器学习/深度学习 固态存储 Linux
一篇文章讲明白Linux下的ping命令用法与实现
一篇文章讲明白Linux下的ping命令用法与实现
75 0