Shell $()、${}、$[]、$(())
Shell中的 $()、${}、$[]、$(())
$()、${} 替换
| 类型 | 功能 | 区别 | 
|---|---|---|
| ${} | 对变量的替换,同$var | ${}会比较精确的界定变量名称的范围 | 
| $() | 对命令的替换,同`` | $()并不是所有shell都支持,可以嵌套使用 ``基本上可用在全部的 unix shell 中使用,不可以嵌套使用 | 
命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行。
${} 变量内容的替换、删除、取代

先定义一个变量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
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号