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[@]} | 返回数组全部元素 | a b c def | $@ 代表命令行中所有的参数,不过把每个参数区分对待,可循环获取 |
| ${A[*]} | 同上 | a b c def | $* 代表命令行中所有的参数,把所有参数看成一个整体 |
| ${A[0]} | 返回数组第一个元素 | a | |
| ${#A[@]} | 返回数组元素总个数 | 4 | $#获取所有输入参数个数,常用于循环 |
| ${#A[*]} | 同上 | 4 | |
| ${#A[3]} | 返回A[3]元素的长度,即def的长度 | 3 | |
| A[3]=xzy | 则是将第四个组数重新定义为 xyz |
$[]、$(()) 运算符
在 $(( ))或$[] 中的变量名称,可加$也可以不加。
$((运算式)) 或 $[运算式]
$(( ))可以将其他进制转成十进制数显示出来echo $((N#xx))
[ranan@hadoop102 ~]$ echo $[(2+3)*4]
20
[ranan@hadoop102 ~]$ echo $((2#110))
6
Shell $()、${}、$[]、$(())的更多相关文章
- 10、Cocos2dx 3.0游戏开发找小三之容器篇:Vector、Map、Value
重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27705613 容器 3.0版本号之前Cocos2d- ...
- GPRS的工作原理、主要特点
源:http://blog.csdn.net/sdudubing/article/details/7682467 GPRS的工作原理.主要特点: 引 言 近年来,通信技术和网络技术的迅速发展,特别是无 ...
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
- ArcGIS Enterprise 10.5.1 静默安装部署记录(Centos 7.2 minimal)- 6、总结
安装小结 安装完成后,首先我们需要将Datastore托管给Server,再将Server托管给Portal以此来完成整个单机版Enterprise 部署流程.为了测试流程是否正确,我们可以采用上传一 ...
- 19、Cocos2dx 3.0游戏开发找小三之Action:流动的水没有形状,漂流的风找不到踪迹、、、
重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30478985 流动的水没有形状.漂流的风找不到踪迹. ...
- POJ 3159 Candies、
题意:n个小孩,m个比较(给你两个孩子代号a,b.然后c意味着a比b最多只能少c个糖果),问1和n之间差距最大的糖果数量. 思路:这是一个差分约束思路 不懂得:传送门, 转化一下就是一个SPFA求最短 ...
- Educational Codeforces Round 10 A B题、
A. Gabriel and Caterpillar 题意: 就是说 一个小孩子去观察毛毛虫从 h1的地方爬到h2的地方.毛毛虫从10点爬到22点.每小时爬的距离是a, 晚上22点到第二天早上10点 ...
- 最小生成树prim、
过年那几天确实没好好学习.在老家闲着也是闲着.可是就是没看书. 回来这几天又一直在弄个人博客.买域名云服务器备案什么的- -. 麻烦死了呢. 在腾讯花1块钱备案了一个网站www.goodgoodstu ...
- Linux-shell-算术运算{expr、bc、dc、(( ))和[ ]}
Linux-shell-算术运算{expr.bc.dc.(( ))和[ ]} 摘自: https://www.cnblogs.com/snowsolf/p/3325235.html 在Linux下做算 ...
- CocoaPods的安装、使用、以及遇到的问题
CocoaPods是什么? 当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等.可能某个类库又用到其他类库,所以要使用它,必须得另外下载其他类库,而 ...
随机推荐
- Python课程笔记(十一)
一.线程与多线程 1.线程与进程 线程指的是 进程(运行中的程序)中单一顺序的执行流. 多个独立执行的线程相加 = 一个进程 多线程程序是指一个程序中包含有多个执行流,多线程是实现并发机制的一种有效手 ...
- Verdi Protocol Analyzer Debug 简单使用
转载:Verdi Protocol Analyzer Debug 简单使用_Holden_Liu的博客-CSDN博客_verdi 技巧 文档与源码: User Guide: UVMDebugUserG ...
- vector之erase和迭代器
C++开发中使用vector时非常方便的,但是也是需要非常小心的,最近在使用容器删除某个元素的时候,测试结果出现了异常 /* vector erase test*/ int testVector() ...
- 二进制小数 牛客网 程序员面试金典 C++ Python
二进制小数 牛客网 程序员面试金典 题目描述 有一个介于0和1之间的实数,类型为double,返回它的二进制表示.如果该数字无法精确地用32位以内的二进制表示,返回"Error". ...
- poj 1704 Georgia and Bob (nim)
题意: N个棋子,位置分别是p[1]...p[N]. Georgia和Bob轮流,每人每次可选择其中一个棋子向左移动若干个位置(不能超过前一个棋子,不能超出最左边[位置1]且不能不移) Georgia ...
- 『动善时』JMeter基础 — 56、JMeter使用命令行模式生成HTML测试报告
目录 1.自动生成HTML图形化报告 2.使用已有的测试结果文件生成HTML报告 3.HTML图形化报告内容详解 (1)Dashboard页面:(重点查看) (2)Charts页面:(辅助分析) 4. ...
- 攻防世界 WEB 高手进阶区 HCTF 2018 warmup Writeup
攻防世界 WEB 高手进阶区 HCTF 2018 warmup Writeup 题目介绍 题目考点 PHP代码审计 Writeup 打开 http://220.249.52.134:37877 常规操 ...
- Loadrunner12的下载和安装
工作需要,学起来 第一部分:安装 一.在惠普官网下载Loadrunner12安装包.下载下来将会有四个安装包. HP_LoadRunner_12.02_Community_Edition_Additi ...
- 动手写一个简单的Web框架(Werkzeug路由问题)
动手写一个简单的Web框架(Werkzeug路由问题) 继承上一篇博客,实现了HelloWorld,但是这并不是一个Web框架,只是自己手写的一个程序,别人是无法通过自己定义路由和返回文本,来使用的, ...
- vue + cesium开发(5) 搭建 vue + cesium开发环境(2)
上vue+cesium开发(1)中,没有进行配置webpack,而是使用了插件进行代替,在使用过程中出现了一些未知BUG,影响体验,因此参考了官方文档对项目进行重新配置,使用了 copy-webpac ...