shell基本计算、逻辑运算、位运算详解
转:http://blog.chinaunix.net/uid-8504518-id-3918531.html
Shell 提供大量的基本运算操作,在脚本中非常有用。Shell 对您提供的算术表达式求值,执行运算展开式,此时使用得出的结果替换表达式。以下面的格式提供运算表达式:$(( expression ))
$ echo $((*(+))) $ result = $(($myvar-))
shell提供方便的数之间的进制转换:
$ echo $(())#八进制
$ echo $((0xA4))#十六进制
还可以使用以下格式指定 2 到 64 之间的任意进制:
$((BASE#NUMBER))
echo $((#))
echo $((#D8))
在 Shell 中进行进制转换的另一个诀窍是使用 bc, 它是一种任意精度运算语言,大多数 UNIX 安装程序都提供。因为它允许您指定输出进制,所以当您需要以十进制以外的进制输出时,这是一种很好的技术。
bc 的特殊变量 ibase 和 obase 分别包含用于输入和输出的进制的值。缺省情况下,都被设置为 10。要执行进制转换,需要改变其中的一个或两个值,然后提供一个数字。
$ echo 'obase=16; 47' | bc 2F
$ echo 'obase=10; ibase=16; A03' | bc
了解了这些基本特性,下边再看看逻辑运算符和逻辑表达式,基本的 + – * / % 不再赘述。
一、逻辑运算符
| 逻辑卷标 | 表示意思 | 
| 1. | 关于档案与目录的侦测逻辑卷标! | 
| -f | 常用!侦测『档案』是否存在 eg: if [ -f filename ] | 
| -d | 常用!侦测『目录』是否存在 | 
| -b | 侦测是否为一个『 block 档案』 | 
| -c | 侦测是否为一个『 character 档案』 | 
| -S | 侦测是否为一个『 socket 标签档案』 | 
| -L | 侦测是否为一个『 symbolic link 的档案』 | 
| -e | 侦测『某个东西』是否存在! | 
| 2. | 关于程序的逻辑卷标! | 
| -G | 侦测是否由 GID 所执行的程序所拥有 | 
| -O | 侦测是否由 UID 所执行的程序所拥有 | 
| -p | 侦测是否为程序间传送信息的 name pipe 或是 FIFO (老实说,这个不太懂!) | 
| 3. | 关于档案的属性侦测! | 
| -r | 侦测是否为可读的属性 | 
| -w | 侦测是否为可以写入的属性 | 
| -x | 侦测是否为可执行的属性 | 
| -s | 侦测是否为『非空白档案』 | 
| -u | 侦测是否具有『 SUID 』的属性 | 
| -g | 侦测是否具有『 SGID 』的属性 | 
| -k | 侦测是否具有『 sticky bit 』的属性 | 
| 4. | 两个档案之间的判断与比较 ;例如[ test file1 -nt file2 ] | 
| -nt | 第一个档案比第二个档案新 | 
| -ot | 第一个档案比第二个档案旧 | 
| -ef | 第一个档案与第二个档案为同一个档案( link 之类的档案) | 
| 5. | 逻辑的『和(and)』『或(or)』 | 
| && | 逻辑的 AND 的意思 | 
| || | 逻辑的 OR 的意思 | 
| 运算符号 | 代表意义 | 
| = | 等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串 | 
| != | 不等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串 | 
| < | 小于 应用于:整型比较 在[] 中,不能使用 表示字符串 | 
| > | 大于 应用于:整型比较 在[] 中,不能使用 表示字符串 | 
| -eq | 等于 应用于:整型比较 | 
| -ne | 不等于 应用于:整型比较 | 
| -lt | 小于 应用于:整型比较 | 
| -gt | 大于 应用于:整型比较 | 
| -le | 小于或等于 应用于:整型比较 | 
| -ge | 大于或等于 应用于:整型比较 | 
| -a | 双方都成立(and) 逻辑表达式 –a 逻辑表达式 | 
| -o | 单方成立(or) 逻辑表达式 –o 逻辑表达式 | 
| -z | 空字符串 | 
| -n | 非空字符串 | 
二、逻辑表达式
- test 命令
 
使用方法:test EXPRESSION
如:
[root@localhost ~]# test = && echo ‘ok’
ok [root@localhost ~]# test -d /etc/ && echo ‘ok’
ok [root@localhost ~]# test -eq && echo ‘ok’
ok [root@localhost ~]# if test = ; then echo ‘ok’; fi
ok
注意:所有字符 与逻辑运算符直接用“空格”分开,不能连到一起。
- 精简表达式
 
- [] 表达式
 [root@localhost ~]# [ -eq ] && echo ‘ok’
ok [root@localhost ~]# [ < ] && echo ‘ok’
-bash: : No such file or directory [root@localhost ~]# [ \< ] && echo ‘ok’ [root@localhost ~]# [ -gt -a -lt ] && echo ‘ok’ ok [root@localhost ~]# [ -gt && -lt ] && echo ‘ok’
-bash: [: missing `]‘注意:在[] 表达式中,常见的>,<需要加转义字符,表示字符串大小比较,以acill码 位置作为比较。 不直接支持<>运算符,还有逻辑运算符|| && 它需要用-a[and] –o[or]表示
- [[]] 表达式
 [root@localhost ~]# [ -eq ] && echo ‘ok’
ok[root@localhost ~]$ [[ < ]] && echo ‘ok’
ok [root@localhost ~]$ [[ < && > ]] && echo ‘ok’
ok
注意:[[]] 运算符只是[]运算符的扩充。能够支持<,>符号运算不需要转义符,它还是以字符串比较大小。里面支持逻辑运算符:|| &&
三、性能比较
bash的条件表达式中有三个几乎等效的符号和命令:test,[]和[[]]。通常,大家习惯用if [];then这样的形式。而[[]]的出现,根据ABS所说,是为了兼容><之类的运算符。以下是比较它们性能,发现[[]]是最快的。
$ time (for m in {..}; do test -d .;done;)
real    0m0.658s
user    0m0.558s
sys     0m0.100s
$ time (for m in {..}; do [ -d . ];done;)
real    0m0.609s
user    0m0.524s
sys     0m0.085s
$ time (for m in {..}; do [[ -d . ]];done;)
real    0m0.311s
user    0m0.275s
sys     0m0.036s
不考虑对低版本bash和对sh的兼容的情况下,用[[]]是兼容性强,而且性能比较快,在做条件运算时候,可以使用该运算符。
四、按位操作运算符
| 运算符 | 名称 | 举例 | 解释value的值 | 
| << | 左移 | value=4>>2 | 4左移2位,value值为16 | 
| >> | 右移 | value=8<<2 | 8右移2位,value值为2 | 
| & | 按位与 | value=8&&4 | 8按位与4,value值为0 | 
| | | 按位或 | value=8|4 | 8按位或4,value值为12 | 
| ~ | 按位非 | value=~8 | 按位非8,value值为-9 | 
| ^ | 按位异或 | value=10^3 | 10按位异或3,value值为9 | 
注: 对于按位非,若求“~a”则结果为-(a+1)举一个详细例子:求“~8”分析由于计算机通常
用补码进行符号运算,[[x]补]补=[x]所以
则8的二进制为00001000 求非为11110111
求反码为1001000求补码为1001001所以最后的结果为1001001,~8 即为-9。
shell基本计算、逻辑运算、位运算详解的更多相关文章
- C#中缓存的使用  ajax请求基于restFul的WebApi(post、get、delete、put)  让 .NET 更方便的导入导出 Excel  .net core api +swagger(一个简单的入门demo 使用codefirst+mysql)  C# 位运算详解  c# 交错数组  c# 数组协变  C# 添加Excel表单控件(Form Controls)  C#串口通信程序
		
C#中缓存的使用 缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可: <%@ Outp ...
 - <转>C++位运算详解
		
原文转自:http://www.crazycpp.com/?p=82 前言 以前收藏过一篇讲C++位操作的文章,这次博客搬家,以前的数据都没有保留,整理谷歌网站管理后台的时候,发现不时的还有网友有在查 ...
 - C语言位运算详解[转]
		
作者:911 说明:本文参考了http://www2.tsu.edu.cn/www/cjc/online/cyuyan/,算是对其的修正,在此将本文列为原创,实有抄袭之嫌疑.甚是惭愧! 位运算是指按二 ...
 - C语言位运算详解
		
位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整形操作数,即只能用于带符号或无符号的char.short.int与long类型 ...
 - C语言位运算详解(转载)
		
转载自:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C ...
 - C# 位运算详解
		
运算符 描述 &(位与) 当两个二进制操作位都为1时,结果就为1 |(位或) 当两个二进制操作位有1个为1时,结果就为1 ^(位异或) 当两个二进制操作位只有1个为1时,结果为1 ~(位非) ...
 - Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
		
Opencv中Mat矩阵相乘——点乘.dot.mul运算详解 2016年09月02日 00:00:36 -牧野- 阅读数:59593 标签: Opencv矩阵相乘点乘dotmul 更多 个人分类: O ...
 - Shell脚本 /dev/null 2>&1详解
		
Shell脚本---- /dev/null 2>&1详解 1.可以将/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. ...
 - java中位运算和移位运算详解
		
一.位运算 (1)按 位 与 & 如果两个相应的二进制形式的对应的位数都为1,则结果为1,记为同1为1,否则为0.首先我们看一下对正数的运算 分别看一下正数和负数的具体运算步骤 ...
 
随机推荐
- Java中一些知识的归纳总结
			
1.包装类型与基本数据类型的区别. Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这使得Java在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据 ...
 - 【洛谷 P4168】[Violet]蒲公英(分块)
			
题目链接 题目大意:给定\(n\)个数和\(m\)个求区间众数的询问,强制在线 这题我\(debug\)了整整一个下午啊..-_- 从14:30~16:45终于\(debug\)出来了,\(debug ...
 - bzoj 2151 贪心
			
几乎完全类似于1150的思路,直接参考那个就行了. http://www.cnblogs.com/BLADEVIL/p/3527193.html /************************** ...
 - 手机端的META
			
一.天猫 <title>天猫触屏版</title> <meta content="text/html; charset=utf-8" http-equ ...
 - CVE-2017-5521: Bypassing Authentication on NETGEAR Routers(Netgear认证绕过漏洞)
			
SpiderLabs昨天发布的漏洞, 用户访问路由器的web控制界面尝试身份验证,然后又取消身份验证,用户就会被重定向到一个页面暴露密码恢复的token.然后通过passwordrecovered.c ...
 - 【Mysql优化】聚簇索引与非聚簇索引概念
			
必须为主键字段创建一个索引,这个索引就是所谓的"主索引".主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是PRIMARY而不是UNIQUE. 首先明白两句话: innod ...
 - android usb adb流程[转]
			
android adb 概述 android adb的代码分为两部分: kernel层的代码在如下路径: drivers/usb/gadget/f_adb.c drivers/usb/gadget/a ...
 - python 学习笔记 多进程
			
要让python程序实现多进程,我们先了解操作系统的相关知识 Unix/Linux操作系统提供了一个fork()系统调用,他非常特殊,普通的函数调用,调用一次,返回一次,但是fork调用一次, 返回两 ...
 - OpenCV-2.4.6-android-sdk 人脸识别demo搭建
			
最近项目需要研究下人脸识别,在领导推荐下准备研究OpenCV 一,上官网了解下 基本知识 http://docs.opencv.org/doc/tutorials/introduction/andro ...
 - iptables 用法及常用模块总结
			
iptables传输数据包的过程: 1. 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去. 2. 如果数据包就是进入本机的,它就会沿着图向下移动, ...