shell中$(( ))、$( )与${ }的区别
转载自:http://blog.sina.com.cn/s/blog_4da051a60102uwda.html
命令替换
在bash中,$( )与` `(反引号)都是用来作命令替换的。
命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行。
exp 1
$ echo today is $(date "+%Y-%m-%d")
today is 2014-07-01
$( )与` `
在操作上,这两者都是达到相应的效果,但是建议使用$( ),理由如下:
- ``很容易与''搞混乱,尤其对初学者来说。
- 在多层次的复合替换中,``必须要额外的跳脱处理(反斜线),而$( )比较直观。
- 最后,$( )的弊端是,并不是所有的类unix系统都支持这种方式,但反引号是肯定支持的。
exp 2
# 将cmd1执行结果作为cmd2参数,再将cmd2结果作为cmd3的参数
cmd3 $(cmd2 $(cmd1))
# 如果是用反引号,直接引用是不行的,还需要作跳脱处理
cmd3 `cmd2 \`cmd1\``
${ }变量替换
一般情况下,$var与${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围
$ A=B
$ echo ${A}B
BB
取路径、文件名、后缀
先赋值一个变量为一个路径,如下:
file=/dir1/dir2/dir3/my.file.txt
| 命令 | 解释 | 结果 | 
|---|---|---|
| ${file#*/} | 拿掉第一条 / 及其左边的字符串 | dir1/dir2/dir3/my.file.txt | 
| ${file##*/} | 拿掉最后一条 / 及其左边的字符串 | my.file.txt | 
| ${file#*.} | 拿掉第一个 . 及其左边的字符串 | file.txt | 
| ${file##*.} | 拿掉最后一个 . 及其左边的字符串 | txt | 
| ${file%/*} | 拿掉最后一条 / 及其右边的字符串 | /dir1/dir2/dir3 | 
| ${file%%/*} | 拿掉第一条 / 及其右边的字符串 | (空值) | 
| ${file%.*} | 拿掉最后一个 . 及其右边的字符串 | /dir1/dir2/dir3/my.file | 
| ${file%%.*} | 拿掉第一个 . 及其右边的字符串 | /dir1/dir2/dir3/my | 
记忆方法如下:
- # 是去掉左边(在键盘上 # 在 $ 之左边)
- % 是去掉右边(在键盘上 % 在 $ 之右边)
- 单一符号是最小匹配;两个符号是最大匹配
- *是用来匹配不要的字符,也就是想要去掉的那部分
- 还有指定字符分隔号,与*配合,决定取哪部分
取子串及替换
| 命令 | 解释 | 结果 | 
|---|---|---|
| ${file:0:5} | 提取最左边的 5 个字节 | /dir1 | 
| ${file:5:5} | 提取第 5 个字节右边的连续 5 个字节 | /dir2 | 
| ${file/dir/path} | 将第一个 dir 提换为 path | /path1/dir2/dir3/my.file.txt | 
| ${file//dir/path} | 将全部 dir 提换为 path | /path1/path2/path3/my.file.txt | 
| ${#file} | 获取变量长度 | 27 | 
根据状态为变量赋值
| 命令 | 解释 | 备注 | 
|---|---|---|
| ${file-my.file.txt} | 若 $file 没设定,则使用 my.file.txt 作传回值 | 空值及非空值不作处理 | 
| ${file:-my.file.txt} | 若 $file 没有设定或为空值,则使用 my.file.txt 作传回值 | 非空值时不作处理 | 
| ${file+my.file.txt} | 若$file 设为空值或非空值,均使用my.file.txt作传回值 | 没设定时不作处理 | 
| ${file:+my.file.txt} | 若 $file 为非空值,则使用 my.file.txt 作传回值 | 没设定及空值不作处理 | 
| ${file=txt} | 若 $file 没设定,则回传 txt ,并将 $file 赋值为 txt | 空值及非空值不作处理 | 
| ${file:=txt} | 若 $file 没设定或空值,则回传 txt ,将 $file 赋值为txt | 非空值时不作处理 | 
| ${file?my.file.txt} | 若 $file 没设定,则将 my.file.txt 输出至 STDERR | 空值及非空值不作处理 | 
| ${file:?my.file.txt} | 若 $file没设定或空值,则将my.file.txt输出至STDERR | 非空值时不作处理 | 
tips:
以上的理解在于, 你一定要分清楚 unset 与 null 及 non-null 这三种赋值状态. 一般而言, : 与 null
有关, 若不带 : 的话, null 不受影响, 若带 : 则连 null 也受影响.
数组
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]} | 返回第四个元素的长度,即def的长度 | 3 | 
| A[3]=xyz | 则是将第四个组数重新定义为 xyz | 
$(( ))与整数运算
bash中整数运算符号
| 符号 | 功能 | 
|---|---|
| + - * / | 分别为加、减、乘、除 | 
| % | 余数运算 | 
| & | ^ ! | 分别为“AND、OR、XOR、NOT” | 
在 $(( )) 中的变量名称,可于其前面加 $ 符号来替换,也可以不用。
$ a=5;b=7;c=2
$ echo $((a+b*c))
19
$ echo $(($a+$b*$c))
19
进制转换
$(( ))可以将其他进制转成十进制数显示出来。用法如下:
echo $((N#xx))
其中,N为进制,xx为该进制下某个数值,命令执行后可以得到该进制数转成十进制后的值。
$ echo $((2#110))   # 二进制转十进制
6
$ echo $((16#2a))   # 十六进制转十进制
42
$ echo $((8#11))    # 八进制转十进制
9
(( ))重定义变量值
$ a=5;b=7$ ((a<b));echo $?
$ ((a++));echo $a
6
$ ((a--));echo $a
5
0
使用(( ))作整数测试时,不要跟[ ]的整数测试搞混乱了。
shell中$(( ))、$( )与${ }的区别的更多相关文章
- terminal(终端),shell,tty,console(控制台)区别
		原文地址 stackexchange:What is the exact difference between a 'terminal', a 'shell', a 'tty' and a 'con ... 
- 【转】控制台,终端,tty,shell等概念的区别
		转自:http://www.2cto.com/os/201403/282583.html http://blog.sina.com.cn/s/blog_bcdac52b0101i2r1.html 控制 ... 
- shell中的$* $@
		shell中$*与$@的区别 关于$* 和 $@的 一点 认识 同是菜鸟一起学习 $* 所有的位置参数,被作为一个单词. 注意:"$*"必须被""引用. $@ ... 
- Linux执行shell脚本方式及区别&命令后台运行
		Linux执行shell脚本方式及区别&命令后台运行 http://blog.csdn.net/heqiyu34/article/details/19089951/ 
- shell各种执行方式区别
		shell 脚本各种执行方式(source ./*.sh, . ./*.sh, ./*.sh)的区别 原文出处:http://blog.csdn.net/dance_rise/article/deta ... 
- shell脚本中的[]/[[]]区别
		转自:http://www.cnblogs.com/include/archive/2011/12/09/2307905.html 引用: http://www.51testing.com/?uid- ... 
- 终端、shell、bash的区别联系
		最佳答案 终端,即所谓的命令行界面,又称命令终端,用户输入shell命令用的窗口,跟Windows里的DOS界面差不多. shell,Shell就是用户和操作系统之间的壳,中介,GUI和CLI都算是S ... 
- shell 中 2>&1 的使用
		一 相关知识 1)默认地,标准的输入为键盘,但是也可以来自文件或管道(pipe |). 2)默认地,标准的输出为终端(terminal),但是也可以重定向到文件,管道或后引号(backquotes ` ... 
- linux shell中'',""和``的区别
		今天学习一个bash脚本,看到有一条:bin=`dirname "$0"` (dirname filename是输出该文件所在的目录,$0是该bash文件的文件名,在bash中一般 ... 
- 命令行界面 (CLI)、终端 (Terminal)、Shell、TTY的区别
		虽然这个话题已是老生常谈,搜索一下应该也能找到大把的相关文章.不过难得提到了这方面,就趁此机会把我的理解写下来,一来看看我是不是真正理解了,二来看看我能不能把它们之间的区别讲得更加简明易懂. 0. 太 ... 
随机推荐
- 基于OpenGL编写一个简易的2D渲染框架-09 重构渲染器-Shader
			Shader 只是进行一些简单的封装,主要功能: 1.编译着色程序 2.绑定 Uniform 数据 3.根据着色程序的顶点属性传递顶点数据到 GPU 着色程序的编译 GLuint Shader::cr ... 
- 使用HttpURLConnection时遇到的资源未释放的问题
			http://blog.sina.com.cn/s/blog_56beadc60100j9zu.html 今天自己写了一个压力测试的小程序,同时启100个线程,每个线程都串行地访问应用服务器上的一个j ... 
- asp.net core in centos
			CentOS 7部署ASP.NET Core应用程序 看了几篇大牛写的关于Linux部署ASP.NET Core程序的文章,今天来实战演练一下.2017年最后一个工作日,提前预祝大家伙元旦快乐.不 ... 
- 框架中spring有专门的类用于处理乱码
			在三大框架spring中有专门的一个过滤器类用于处理乱码问题--->CharacterEncodingFilter 我们只需在web.xml中添加如下几行代码就可解决乱码问题 <filte ... 
- 常用数据库ID格式
			转自:http://www.biotrainee.com/thread-411-1-1.html 常用数据库 ID ID 示例 ID 来源 ENSG00000116717 Ensemble ID GA ... 
- git仓库搬家
			1). 从原地址克隆一份裸版本库 git clone --bare git://xxxxx.com/xxx.git 2). 然后到新的 Git 服务器上创建一个新项目 3). 以镜像推送的方式上传代码 ... 
- 3.Longest Substring Without Repeating Characters(string; HashTable)
			Given a string, find the length of the longest substring without repeating characters. For example, ... 
- C++强制转换
			static_cast,dynamic_cast, const_cast, reinterpret_cast dynamic_cast比static_cast多了安全检测,判断源和目标有无继承被继承关 ... 
- compression
			compression - 必应词典 美[kəmˈpreʃ(ə)n]英[kəm'preʃ(ə)n] n.压缩:加压:压紧:浓缩 网络压迫:压力:加压包扎 
- android SQLiteDatabase数据库使用的时候 常见问题
			用数据库的时候有时候一定要用_id否则会报错 对于Contentprovider的查询用contentResolver.insert() 一般的数据库操作用db.insert(); 
