linux系统中的命令替换与整数运算$(),$(())
一、$()与``
在 bash shell 中,$( ) 与 ` ` (反引号) 都是用来做命令替换(command substitution)用的。
所谓的命令替换与我们第五章学过的变量替换差不多,都是用来重组命令行:完成引号里的命令行,然后将其结果替换出来,再重组命令行。
例如:
$ echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)
虽然$()与``在功能上区别不大,但是在使用上也有差别:
1. 在多层次的复合替换中,` ` 须要额外的跳脱( \` )处理,而 $( ) 则比较直观。
例如,这是错的:
command1 `command2 `command3` `
原本的意图是要在 command2 `command3` 先将 command3 提换出来给 command 2 处理,然后再将结果传给command1 `command2 ...` 来处理。然而,真正的结果在命令行中却是分成了`command2 `与 ``两段。
正确的输入应该如下:
command1 `command2 \`command3\` `
如果换成 $( ) 就没问题了:
command1 $(command2 $(command3))
2. 使用范围上,` `基本上可用在全部的 unix shell 中使用,若写成 shell script ,其移植性比较高。而$( )并不见的每一种shell都能使用
二、${}
它是用来作变量替换的,详情参考1.07变量
三、$(( ))
它是用来作整数运算的。
在 bash 中,$(( )) 的整数运算符号大致有这些:
+ - * / :分别为 "加、减、乘、除"。
% :余数运算
& | ^ !:分别为 "AND、OR、XOR、NOT" 运算。
例:
$ a=5; b=7; c=2
$ echo $(( a+b*c ))
19
$ echo $(( (a+b)/c ))
6
$ echo $(( (a*b)%c))
1
在 $(( )) 中的变量名称,可于其前面加 $ 符号来替换,也可以不用,如:
$(( $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) 的返回值。
常见的用于 (( )) 的测试符号有如下这些:
<:小于
>:大于
<=:小于或等于
>=:大于或等于
==:等于
!=:不等于
不过,使用 (( )) 作整数测试时,请不要跟 [ ] 的整数测试搞混乱了。
四、参考
1. 《shell十三问》
(完)
随机推荐
- bzoj1017(JSOI2008)魔兽地图
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1017 钱数很少,所以它也能压进状态里. 还有向上贡献几个物品.所以状态就是第 i 号物品,向 ...
- pandas之DateFrame 数据过滤+遍历行+读写csv-txt-excel
# XLS转CSV df = pd.read_excel(r'列表.xls') df2 = pd.DataFrame()df2 = df2.append(list(df['列名']), ignore_ ...
- cowboy页面重定向的例子
创建工程 rebar-creator create-app testCowboy testCowboy_app.erl -module(testCowboy_app). -behaviour(appl ...
- JAVA课程设计(坦克大战)
2019-01-16 坦克大战游戏背景: 1. 需求分析 1.1环境要求 操作系统:Windows 7(SP1)以上 JAVA虚拟机:JDK1.8以上 开发环境:Eclipse(4.5以上) 1.2角 ...
- Hibernate学习4—关联关系一对多映射2
第四节:班级学生一对多映射实现(双向) 查询班级的时候能够获取所有的学生: 在上一节的基础之上:我们在Class端也保存学生的关系: com.cy.model.Class: public clas ...
- mysql 数据库 自动截取数据的问题---mysql的sql_model的四种模式:宽松模式、严格模式
mysql支持的sql_mode模式:ANSI.TRADITIONAL.STRICT_ALL_TABLES和STRICT_TRANS_TABLES. ANSI模式:宽松模式,对插入数据进行校验,如果不 ...
- git clone 后使用子分支
git clone 项目git地址 git branch -a 切换到子分支进行开发 git ckeckout 子分支名称,如:git checkout dev_feature_call git pu ...
- PHP中使用mkdir创建多级目录的方法
function mkdirs($dir) { if(!is_dir($dir)) { if(!mkdirs(dirname($dir))){ return false; ...
- 给iOS开发新手送点福利,简述UILabel的属性和用法
UILabel属性 1.text:设置标签显示文本. label.text = @"我是Label"; 2.attributedText:设置标签属性文本. NSString *t ...
- linux下启动关闭oracle
1. linux下启动oracle su - oracle sqlplus /nolog conn /as sysdba startup exit lsnrctl start 2. linux下关闭o ...