Shell $()、${}、$[]、$(())

Shell中的 $()、${}、$[]、$(())

$()、${} 替换

类型 功能 区别
${} 对变量的替换,同$var ${}会比较精确的界定变量名称的范围
$() 对命令的替换,同`` $()并不是所有shell都支持,可以嵌套使用
``基本上可用在全部的 unix shell 中使用,不可以嵌套使用

命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行。

${} 变量内容的替换、删除、取代

image

先定义一个变量path,值为PATH的值

[ranan@hadoop102 ~]$ path=${PATH}
[ranan@hadoop102 ~]$ echo $path
/home/ranan/.local/bin:/home/ranan/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/module/jdk1.8.0_212/bin:/opt/module/hadoop-3.1.3/bin:/sbin

path = /home/ranan/.local/bin:/home/ranan/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/module/jdk1.8.0_212/bin:/opt/module/hadoop-3.1.3/bin:/sbin

并没有对原数据进行操作,原数据还是没有改变

${变量#关键字} 删除从左到右第一个符合的最短数据,最短匹配
${变量##关键字} 删除从左到右第一个符合的最长数据,最长匹配

删除第一个路径/home/ranan/.local/bin
[ranan@hadoop102 ~]$ echo ${path#*:}
/home/ranan/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/module/jdk1.8.0_212/bin:/opt/module/hadoop-3.1.3/bin:/sbin

删除最后一个:之前的数据
[ranan@hadoop102 ~]$ echo ${path##*:}
/sbin

${变量%关键字} 删除从右到左第一个符合的最短数据,最短匹配
${变量%%关键字} 删除从右到左第一个符合的最长数据,最长匹配

删除最后一个路径,最后一个:开始的任何内容,所以是:*
[ranan@hadoop102 ~]$ echo ${path%:*}
/home/ranan/.local/bin:/home/ranan/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/module/jdk1.8.0_212/bin:/opt/module/hadoop-3.1.3/bin

保留第一个路径
[ranan@hadoop102 ~]$ echo ${path%%:*}
/home/ranan/.local/bin

${变量/旧字符串} 第一个旧字符串会被新字符串替换
${变量//新字符串} 全部的旧字符串会被新字符串替换

替换第一个ranan为RANAN
[ranan@hadoop102 ~]$ echo ${path/ranan/RANAN}
/home/RANAN/.local/bin:/home/ranan/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/module/jdk1.8.0_212/bin:/opt/module/hadoop-3.1.3/bin:/sbin

替换所有的ranan为RANAN
[ranan@hadoop102 ~]$ echo ${path//ranan/RANAN}
/home/RANAN/.local/bin:/home/RANAN/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/module/jdk1.8.0_212/bin:/opt/module/hadoop-3.1.3/bin:/sbin

其他用法
${变量:数字1:数字2} 从第一个数字起提取数字2个字节。
${#变量} 获取变量长度

数组

A="a b c def"   # 定义字符串
A=(a b c def)   # 定义字符数组
命令 解释 结果 补充
$ 返回数组全部元素 a b c def $@ 代表命令行中所有的参数,不过把每个参数区分对待,可循环获取
$ 同上 a b c def $* 代表命令行中所有的参数,把所有参数看成一个整体
$ 返回数组第一个元素 a
$ 返回数组元素总个数 4 $#获取所有输入参数个数,常用于循环
$ 同上 4
$ 返回A[3]元素的长度,即def的长度 3
A[3]=xzy 则是将第四个组数重新定义为 xyz

$[]、$(()) 运算符

在 $(( ))或$[] 中的变量名称,可加$也可以不加。

$((运算式)) 或 $[运算式]

$(( ))可以将其他进制转成十进制数显示出来echo $((N#xx))

[ranan@hadoop102 ~]$ echo $[(2+3)*4]
20
[ranan@hadoop102 ~]$ echo $((2#110))
6
posted @ 2021-11-30 21:31  rananie  阅读(561)  评论(0)    收藏  举报