文档章节

shell 中$()、${}、$(())

 林鼎
发布于 2014/05/03 01:26
字数 633
阅读 36
收藏 0

1、$()

    $()月``都是用作替换命令的。在bash2中,两者的作用完全等价。但是$()是``使用更加方便(存在嵌套使用该命令的时候),因为$()不用转义,而且内部的``却需要转义,请看使用``的情况

lhj@lhj-virtual-machine:~$ echo `ll `pwd`/test.sh`
bash: /test.sh: 没有那个文件或目录
lhj@lhj-virtual-machine:~$ echo `ll \`pwd\`/test.sh`
-rwxrw-r-- 1 lhj lhj 31 5月 3 00:29 /home/lhj/test.sh

    使用$()的情况

lhj@lhj-virtual-machine:~$ echo $(ll $(pwd)/test.sh)
-rwxrw-r-- 1 lhj lhj 31 5月 3 00:29 /home/lhj/test.sh

    ··可以在所用的unix shell中使用。而$()只能在bash2中使用,所以使用$()写出的shell比用``写出的可移植行查

2、${}

    $var与${var}基本上没有区别,但是${}会比较更精确界定变量的范围,例如

    

lhj@lhj-virtual-machine:~$ A=B
lhj@lhj-virtual-machine:~$ echo $AB

lhj@lhj-virtual-machine:~$ echo ${A}B
BB

    当然,${}不止存在这个优势

    使用${}或者变量不通的值,定义

    

file=/dir1/dir2/dir3/my.file.txt

    我们输入${file#/*},结果为

lhj@lhj-virtual-machine:~$ echo ${file#*/}
dir1/dir2/dir3/my.file.txt

    结果是去掉第一个“/”以及其左边后所获得的值,接着看${file##*/}

lhj@lhj-virtual-machine:~$ echo ${file##*/}
my.file.txt

    结果是去掉最后一个"/"及其左边后所获的值,接着再看${file%*}

lhj@lhj-virtual-machine:~$ echo ${file%/*}
/dir1/dir2/dir3

    结果是去掉最后一个"/"及其右边后所获的值,最后看${file%%/*}

lhj@lhj-virtual-machine:~$ echo ${file%%/*}

    结果是去掉第一个"/"及其右边后所获的值。

    ${}的功能还不止体现在上面的两个功能,它也能进行变量的替换,请看${file/dir/path}和${file//dir/path}命令

lhj@lhj-virtual-machine:~$ echo ${file/dir/path}
/path1/dir2/dir3/my.file.txt
lhj@lhj-virtual-machine:~$ echo ${file//dir/paht}
/paht1/paht2/paht3/my.file.txt

3、$(()) ,它是用作整数运算的。

在 $(( )) 中的变量名称,可于其前面加 $ 符号来替换,也可以不用,如:
$(( $a + $b * $c)) 也可得到 19 的结果

此外,$(( )) 还可作不同进位(如二进制、八进位、十六进制)作运算呢,只是,输出结果皆为十进制而已:
echo $((16#2a)) 结果为 42 (16进位转十进制)
以一个实用的例子来看看吧:
假如当前的   umask 是 022 ,那么新建文件的权限即为:
$ umask 022
$ echo "obase=8;$(( 8#666 & (8#777 ^ 8#$(umask)) ))" | bc
644

事实上,单纯用 (( )) 也可重定义变量值,或作 testing:
a=5; ((a++)) 可将 $a 重定义为 6 
a=5; ((a–)) 则为 a=4
a=5; b=7; ((a < b)) 会得到   0 (true) 的返回值。
常见的用于 (( )) 的测试符号有如下这些:
<:小于
>:大于
<=:小于或等于
>=:大于或等于
==:等于
!=:不等于


© 著作权归作者所有

上一篇: shell rev
下一篇: linux awk命令
粉丝 3
博文 20
码字总数 4197
作品 0
广州
高级程序员
私信 提问
[shell问答录]:命令、进程、子shell...

前些天在CU上讨论一个统计正在执行的脚本数量的问题过程中,发现自己对于shell如何执行命令方面了解还是甚少,惭愧惭愧...期间得到waker兄的指点,在此表示感谢!他的说法除了个别地方不太准...

JavaGG
2009/05/06
896
0
[shell问答录]:命令、进程、子shell...

前些天在CU上讨论一个统计正在执行的脚本数量的问题过程中,发现自己对于shell如何执行命令方面了解还是甚少,惭愧惭愧...期间得到waker兄的指点,在此表示感谢!他的说法除了个别地方不太准...

范堡
2009/05/06
810
0
Linux shell 程序设计1——安装及入门

1、什么是shell? shell是linux内核的“壳”,是用户和内核的桥梁。它类似于windows下的命令提示符,将用户输入的命令解释给内核执行,并返回给用户结果。与windows命令提示符不同的是,she...

宅蓝三木
2014/04/24
68
0
【Linux】 登陆shell与交互式非登陆shell的区别

登录shell 所谓登录shell,指的是当用户登录系统时所取的那个shell,登录shell属于交互式shell。 登录shell将查找4个不同的启动文件来处理其中的命令。 bash shell处理文件的顺序如下: 1:/e...

SibylY
2016/01/07
1K
0
Linux自学(二)

shell概念(来源百度百科) 在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器)。它类似于DOS下的command和后来的cmd.exe。它接收用户命令,然后...

散步留馨
2016/03/05
50
0

没有更多内容

加载失败,请刷新页面

加载更多

消息中间件——RabbitMQ的高级特性

前言 前面我们介绍了RabbitMQ的安装、各大消息中间件的对比、AMQP核心概念、管控台的使用、快速入门RabbitMQ。本章将介绍RabbitMQ的高级特性。分两篇(上/下)进行介绍。 消息如何保障100%的...

Java架构师ya七
36分钟前
6
0
如何编写高质量的 JS 函数(1) -- 敲山震虎篇

本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/7lCK9cHmunvYlbm7Xi7JxQ 作者:杨昆 一千个读者,有一千个哈姆雷特。 此系列文章将会从函数的执行机制、鲁棒性、函...

vivo互联网技术
今天
6
0
学会这5个Excel技巧,让你拒绝加班

在网上,随处都可以看到Excel技巧,估计已看腻了吧?但下面5个Excel技巧会让你相见恨晚。关键的是它们个个还很实用 图一 技巧1:快速删除边框 有时当我们处理数据需要去掉边框,按Ctrl+Shif...

干货趣分享
今天
11
0
JS基础-该如何理解原型、原型链?

JS的原型、原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对这个...

OBKoro1
今天
10
0
高防CDN的出现是为了解决网站的哪些问题?

高防CDN是为了更好的服务网络而出现的,是通过高防DNS来实现的。高防CDN是通过智能化的系统判断来路,再反馈给用户,可以减轻用户使用过程的复杂程度。通过智能DNS解析,能让网站访问者连接到...

云漫网络Ruan
今天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部