shell语法之${},“,$(),$(())四种语法含义

  • Post author:
  • Post category:其他

1.${ } 变量、截取、替换

${ } 通常是获取变量的值,但也可以进一步对变量的值进行”加工”处理,例如:字符串的截取,替换

1.1 获取变量值

${}获取变量的值,下面例子,定义了变量a,值test

[root@zxp1 /opt/script]# a=test
[root@zxp1 /opt/script]# echo $a     //可以省略{}
test
[root@zxp1 /opt/script]# echo ${a}  
test
[root@zxp1 /opt/script]# echo $ab    //这种情况会造成字段不能识别,字段边界模糊的问题

[root@zxp1 /opt/script]# echo ${a}b  //通过{}可以清晰表示字段名称的边界
testb

1.2 字符串截取

获取变量值只是它的基本功能,

{}获取变量值只是它的基本功能,

获取变量值只是它的基本功能,{}内部还支持变量替换,变量截取,先看看基本语法

通过删除不需要的部分子串来截取

#是去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号#,%是最小匹配;两个符号##,%%是最大匹配

这种语法,我自己给他取个名字,“砍头去尾” 语法,这个用法通常会搭配通配符 ’ * ’ 来使用。
为什么叫砍头去尾呢?看下下面例子
如下,定义变量path=/etc/sysconfig/network

[root@zxp1 ~]# path=/etc/sysconfig/network
[root@zxp1 ~]# echo ${path#*/}     //去掉path变量左边 第一次出现 */  子串    *代表匹配任意0或0个以上字符
etc/sysconfig/network
[root@zxp1 ~]# echo ${path#tc}     //像这样是匹配不成功的,第一个字符‘t’ 与 左边第一个字符‘/’没匹配上,直接就结束了
/etc/sysconfig/network
[root@zxp1 ~]# echo ${path##*/}    //最大匹配
network
[root@zxp1 ~]# echo ${path%/*}     //去掉path变量右边匹配的子串
/etc/sysconfig
[root@zxp1 ~]# echo ${path%%/*}  

[root@zxp1 ~]#
通过字符坐标获取

第一个 “:” 后面数字代表字符开始的位置,第二个 “:”后面数字代表要获取子串的长度

[root@zxp1 ~]# echo ${path:0:5}
/etc/
[root@zxp1 ~]# echo ${path:3:7}
c/sysco

1.3 字符替换

[root@zxp1 ~]# echo ${path/et/op}   //第一个出现的et替换成op
/opc/sysconfig/network
[root@zxp1 ~]# echo ${path//et/op}  //所有出现的et替换成op
/opc/sysconfig/nopwork

2. ``与$() 命令替换

``和$() 内部通常是一个shell命令,在执行脚本之前,会先执行这个命令,相当于函数调用

[root@zxp1 ~]# echo date           //直接当成字符串输出
date
[root@zxp1 ~]# echo `date`         //相当于函数调用,先执行date命令
Tue Sep 3 16:10:43 CST 2019
[root@zxp1 ~]# echo $(date)       //作用与上面的命令一样,但不是所有版本的linux系统都支持
Tue Sep 3 16:11:45 CST 2019

3.$(())与expr 整数运算

[root@zxp1 ~]# echo $((3+2))
5
[root@zxp1 ~]# echo $((3*2))
6
[root@zxp1 ~]# echo `expr 2+3`   //运算符前后需要空格
2+3
[root@zxp1 ~]# echo `expr 2 + 3` 
5
[root@zxp1 ~]# echo `expr 2 * 3` //会提示语法错误,需要转义
expr: syntax error
[root@zxp1 ~]# echo `expr 2 \* 3`
6

版权声明:本文为qq_24393347原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。