1、算术操作符

2、关系操作符

3、布尔操作符

4、字符串操作符

5、文件相关操作符

算术操作符

bash shell 没有提供任何机制来执行简单的算术运算,不过我们可以借助于一些其他程序,如 expr

#!/bin/sh

val=`expr 2 + 2`
echo "Total value : $val"

注意:在操作符与表达式之间必须有空格,整个表达式应该用反引号括起来。

其他可用算术操作符:

+:`expr 10 + 20`

-:`expr 10 - 20`

*: `expr 10 \* 20` (需要转义乘号)

/: `expr 10 / 2`

%: `expr 10 % 3`

=: (赋值) a = $b,将 b 的值赋予 a

==:  [ $a == $b ] 判断两个数是否相等,相等返回 true

!=: [ $a != $b ] 判断两个数是否不想等,不想等返回 true

注意:所有的条件表达式里面的变量、操作符都需要有逗号分隔。至于为什么这样,个人觉得是类似于 $1, $2 ... $n,这种参数获取方式,如果连在一起,可能系统就把这连在一起的两个当作一个操作数什么的。

关系操作符

-eq:判断两个操作对象是否相等,例:[ $a -eq $b ]

-ne:判断两个操作对象是否不想等,例:[ $a -ne $b ]

-gt:判断第一个操作对象是否大于第二个操作对象,例:[ $a -gt $b ]

-lt:判断第一个操作对象是否小于第二个操作对象,例:[ $a -lt $b ]

-ge:[ $a ge $b ],判断 $a 是否大于等于 $b

-le: [ $a le $b ],判断 $a 是否小于等于 $b

逻辑操作符

-a:与,[ $a -lt 20 -a $b -gt 100 ] ,$a 小于 20 且 $b 大于 100 的时候返回 true

-o:或,[ $a -lt 20 -o $b -gt 100 ] ,$a 小于 20 或 $b 大于 100 的时候返回 true

!:非,[ ! false ] 返回 true

字符串比较

=:[ $a = $b ],判断 $a 与 $b 是否相等,注意不是 "=="

!=:[ $a != $b ],判断 $a 与 $b 是否不想等

-z:判断字符串长度是否为0,[ -z $a ],如果 $a 长度为0返回 true

-n:判断字符串长度是否不为0,[ -n $a ],如果 $a 长度不为0返回 true

str:[ $a ],字符串里面如果全是空格,会返回 false,"     " => false,获取字符串长度的方法:${#str}

暂时不知道 -z 和 -n 的具体用法,上面的 -z 和 -n,在字符串长度不为 0 的时候 -z 也返回了 true。

文件相关判断符

-b:判断文件是不是 block special 文件,硬盘分区是 block special 文件,如:[ -b /dev/disk1s1 ] 会返回 true。

-c:判断文件是不是 character special 文件,[ -c $file ]

-d:判断是不是 目录

-f:判断是不是普通文件,而不是目录或特殊文件

-g:判断文件是否设置了 SGID(Set GID)

-k:判断文件是否设置了 SBIT(Sticky Bit)

-p:判断文件是否是命名管道

-t:判断文件描述符是否是打开状态并且关联了终端

-u:判断文件是否设置了 SUID(Set User ID)

-r:判断文件是否可读

-w:判断文件是否可写

-x:判断文件是否可执行

-s:判断文件的大小是否大于 0

-e:判断文件是否存在

扩展阅读:

1、character special 和 block special 文件类型

When a program reads or writes data from a file, the requests go to a kernel driver. If the file is a regular file, the data is handled by a filesystem driver and it is typically stored in zones on a disk or other storage media, and the data that is read from a file is what was previously written in that place. There are other file types for which different things happen.

When data is read or written to a device file, the request is handled by the driver for that device. Each device file has an associated number which identifies the driver to use. What the device does with the data is its own business.

Block devices (also called block special files) usually behave a lot like ordinary files: they are an array of bytes, and the value that is read at a given location is the value that was last written there. Data from block device can be cached in memory and read back from cache; writes can be buffered. Block devices are normally seekable (i.e. there is a notion of position inside the file which the application can change). The name “block device” comes from the fact that the corresponding hardware typically reads and writes a whole block at a time (e.g. a sector on a hard disk).

Character devices (also called character special files) behave like pipes, serial ports, etc. Writing or reading to them is an immediate action. What the driver does with the data is its own business. Writing a byte to a character device might cause it to be displayed on screen, output on a serial port, converted into a sound, ... Reading a byte from a device might cause the serial port to wait for input, might return a random byte (/dev/urandom), ... The name “character device” comes from the fact that each character is handled individually.

翻译过来大致是:

块设备(block special) 读写数据的时候是交给设备驱动处理的,怎么处理是设备驱动的事。块设备的数据读写可缓存,块设备读写数据的单位是 block(如:磁盘上的一个扇区)。

字符文件(character special) 读写数据类似于管道,端口;读写是即时处理的;写入这些文件的时候结果可能是显示到屏幕、输出到端口、转换成声音等,从这些文件读取的时候,可能会导致端口等待输入,或者返回一个随机的 byte(/dev/urandom);之所以叫 character special 是因为这些文件一次只会处理单个字符。

2、SGID、SUID、Sticky Bit

SUID

SUID 会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。

如:

ls -l /usr/bin/passwd

结果:

-rwsr-xr-x 1 root root 42824 Sep 13  2012 /usr/bin/passwd

我们可以看到文件拥有者的执行位那里是 s而不是x, 所以说passwd这个程序是具有SUID权限的。我们直到在修改用户密码的时候,用的就是passwd这个命令,而我们又知道在linux下面,用户密码是存储在/etc/shadow这个文件里面的。首先查看一下/etc/shadow这个文件的权限:

ls -l /etc/shadow

结果:

-rw-r----- 1 root shadow 1138 Dec 13 20:00 /etc/shadow

由上面的结果,我们知道只有root可以往shadow文件中写入数据,其他用户连查看的权限都没有。那我们平时是怎么修改密码呢?没错,就是和SUID有关。当我们使用passwd命令时,就获得了passwd的所有者即root的权限,进而可以对shadow文件进行写入操作。使用SUID肯定满足一下几点:

1.SUID只对二进制文件有效

2.调用者对该文件有执行权

3.在执行过程中,调用者会暂时获得该文件的所有者权限

4.该权限只在程序执行的过程中有效

SGID

SGID即Set GID的缩写,它出现在文件所属组权限的执行位上面,它对普通二进制文件和目录都有效。当它作用于普通文件时,和SUID类似,在执行该文件时,用户将获得该文件所属组的权限。当SGID作用于目录时,意义就非常重大了。当用户对某一目录有写和执行权限时,该用户就可以在该目录下建立文件,如果该目录用SGID修饰,则该用户在这个目录下建立的文件都是属于这个目录所属的组。

  

SBIT

SBIT即Sticky Bit,它出现在其他用户权限的执行位上,它只能用来修饰一个目录。当某一个目录拥有SBIT权限时,则任何一个能够在这个目录下建立文件的用户,该用户在这个目录下所建立的文件,只有该用户自己和root可以删除,其他用户均不可以。例如:

ls -ld /tmp

结果:

drwxrwxrwt 12 root root 12288 Dec 17 16:33 /tmp

可以看到最后一位为t,这说明/tmp文件就是这种文件。

那么,如何设置上面所说的三种权限呢?首先来介绍一点预备的知识,用数字来表示权限:

4表示SUID
2表示SGID
1表示SBIT

如果两个或三个权限同时存在时,就将者写权限的值相加就是需要的结果了。利于SUID和SGID同时存在,则为6。下面可以看一下修改的例子:

 chmod 4777 test 
使test文件具有SUID权限,你可能已经看明白了,就是在普通文件权限前面再加上这些特殊权限值就可以了。
 
 

shell 中的操作符的更多相关文章

  1. shell中命令之间数据的传递

    1.管道 "|" ls | cat -n > out.txt 2. 子shell 2.1 子shell 说明 在shell脚本中可以用()操作符可以定义一个子shell #/ ...

  2. shell 中数学计算总结

    shell中的赋值和操作默认都是字符串处理,在此记下shell中进行数学运算的几个特殊方法,以后用到的时候可以来看,呵呵.   1.错误方法举例   a)   var=1+1   echo $var  ...

  3. shell中截取字符串的方法总结

    shell中截取字符串的方法有很多种, ${expression}一共有9种使用方法. ${parameter:-word} ${parameter:=word} ${parameter:?word} ...

  4. shell中的数学运算

    shell中要进行数学运算通常有3中方法: expr命令 比如 expr 1 + 6就会返回7,使用expr的缺点就是碰到乘法运算,或者加括号(因为它们在shell中有其他意义),需要使用转义,比如: ...

  5. SHELL中的特殊变量和结构

    SHELL中的特殊变量和结构 表格 B-1. 特殊的shell变量 变量 含义 $0 脚本名字 $1 位置参数 #1 $2 - $9 位置参数 #2 - #9 ${10} 位置参数 #10 $# 位置 ...

  6. Linux - 简明Shell编程14 - 操作符(Operator)

    脚本地址 https://github.com/anliven/L-Shell/tree/master/Shell-Basics 示例脚本及注释 #!/bin/bash echo "No c ...

  7. shell 中test命令

    test可用于测试表达式,支持测试的范围包括:字符串比较,算术比较,文件存在性.属性.类型等判断.例如,判断文件是否为空.文件是否存在.是否是目录.变量是否大于5.字符串是否等于"longs ...

  8. Shell - 简明Shell入门14 - 操作符(Operator)

    示例脚本及注释 #!/bin/bash echo "No code, just some comments." # ### 通配符 # * 代表任意(0个或多个)字符 # ? 代表 ...

  9. shell中的变量a=100, 什么时候作整数使用, 什么时候作字符串使用呢?

    shell中的变量a=100, 什么时候作整数使用, 什么时候作字符串使用呢? 这确实是一个困扰很久的一个问题? how it can be an issue? 事实上, 在shell中, 你可以认为 ...

随机推荐

  1. virtual box下安装ubuntu经验

    1. 哪怕下载的是ubuntu64位版本,也在vitualbox下选择ubuntu而不要选择ubuntu(64bit) 2. 安装VBoxGuestAdditional.iso:下载和vbox版本相匹 ...

  2. 元素transform: rotate()之后,元素宽高该怎么计算?

    通常,利用transform: rotate()元素之后,我们并不会去在意元素大小的变化,因为看上去并没有什么变化.虽然看上去没有变化,其实是有变化的.下面用一个例子来说明一下. html: < ...

  3. SecureCRT SSH连接一直提示密码错误

    这是解决方法:  http://www.linuxidc.com/Linux/2016-09/134925.htm

  4. 20145214 《网络对抗技术》 Web基础

    20145214 <网络对抗技术> Web基础 1.实验后回答问题 (1)什么是表单 表单在网页中主要负责数据采集,提供了填写数据.选择数据,收集数据并提交给后台的功能 一个表单有三个基本 ...

  5. 手机端学习助手的说明书需求以及团队PM选择

    1.产品的背景 课堂上知识容量大.密度高,学生不能立刻掌握所学知识点,同时,网上资料冗杂繁复,指向性不强,导致学生不能高效的学习,为了充分利用学生的课余时间,培养学生自学能力,辅助老师教学,我们小组希 ...

  6. Struct2笔记②--完善登陆代码

      上节课的代码 写完整 登陆成功在页面上显示用户名和密码: username:${requestScope.username }<br> password:${requestScope. ...

  7. 生命周期事件和 Global.asax 文件

    文章:IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述 该文章有介绍Application_Start方法

  8. 索引超出了数组界限。 在 System.Collections.Generic.Dictionary`2.Resize

    博问:Dictionary 超出了数组界限 异常: Exception type: IndexOutOfRangeException Exception message: 索引超出了数组界限. 在 S ...

  9. BETA-6

    前言 我们居然又冲刺了·六 团队代码管理github 站立会议 队名:PMS 530雨勤(组长) 过去两天完成了哪些任务 新方案代码比之前的更简单,但是对场景的要求相应变高了,已经实现,误差感人 代码 ...

  10. 用node研究axios前后端交互状态码规则

    研究状态码规则围绕我的脑袋有些时间了. 加上最近比较不忙,开始了这方面的研究. 后端用的是直接跑过的node框架,express.可以直接参考express官方网站:http://www.expres ...