一、文件測试操作符

假设以下的条件成立将会返回真.

-e

文件存在

-a

文件存在

这个选项的效果与-e同样. 可是它已经被"弃用"了, 而且不鼓舞使用.

-f

表示这个文件是一个 一般 文件(并非文件夹或者设备文件)

-s

文件大小不为零

-d

表示这是一个文件夹

-b

表示这是一个块设备(软盘, 光驱, 等等.)

-c

表示这是一个字符设备(键盘, modem, 声卡, 等等.)

-p

这个文件是一个管道

-h

这是一个符号链接

-L

这是一个符号链接

-S

表示这是一个socket

-t

文件(描写叙述符)被关联到一个终端设备上

这个測试选项一般被用来检測脚本中的 stdin ( [

终端.

-t 0 ] )

或者 stdout ( [

-t 1 ] )是否来自于一个

-r

文件是否具有可读权限( 指的是正在执行这个測试命令的用户是否具有读权限)-w

文件是否具有可写权限(指的是正在执行这个測试命令的用户是否具有写权限)

-x

文件是否具有可运行权限(指的是正在运行这个測试命令的用户是否具有可运行权限)

-g

set-group-id(sgid)标记被设置到文件或文件夹上

假设文件夹具有 sgid 标记的话, 那么在这个文件夹下所创建的文件将属于拥有这个文件夹的用户组, 而

不必是创建这个文件的用户组. 这个特性对于在一个工作组中共享文件夹很实用.

-u

set-user-id (suid)标记被设置到文件上

假设一个root用户所拥有的二进制可运行文件设置了 set-user-id 标记位的话, 那么普通用户也会

以root权限来执行这个文件. [1] 这对于须要訪问系统硬件的执行程序(比方pppd和cdrecord)非

常实用. 假设没有suid标志的话, 这些二进制运行程序是不可以被非root用户调用的.

-rwsr-xr-t

1 root

178236 Oct

2

2000

/usr/sbin/pppd

对于设置了 suid 标志的文件, 在它的权限列中将会以s 表示.

-k

设置 粘贴位

对于"粘贴位"的一般了解, save-text-mode标志是一个文件权限的特殊类型. 假设文件设置了这

个标志, 那么这个文件将会被保存到缓存中, 这样能够提高訪问速度. [2] 粘贴位假设设置在目

录中, 那么它将限制写权限. 对于设置了粘贴位的文件或文件夹, 在它们的权限标记列中将会显

示t .

drwxrwxrwt

7 root

1024 May 19 21:26 tmp/

假设用户并不拥有这个设置了粘贴位的文件夹, 可是他在这个文件夹下具有写权限, 那么这个用户仅仅

能在这个文件夹下删除自己所拥有的文件. 这将有效的防止用户在一个公共文件夹中不慎覆盖或者删

除别人的文件. 比方说 /tmp 文件夹. (当然, 文件夹的全部者或者 root用户能够任意删除或重命名当中

的文件.)

-O

推断你是否是文件的拥有者

-G

文件的group-id是否与你的同样

-N

从文件上一次被读取到如今为止, 文件是否被改动过

f1 -nt f2

文件 f1 比文件 f2 新

f1 -ot f2

文件 f1 比文件 f2 旧

f1 -ef f2文件 f1 和文件 f2 是同样文件的硬链接

!

"非" -- 反转上边全部測试的结果(假设没给出条件, 那么返回真).

二、其它比較操作符

二元比較操作符用来比較两个变量或数字. 注意整数比較与字符串比較的差别.

整数比較

-eq

等于

if [ "$a" -eq "$b" ]

-ne

不等于

if [ "$a" -ne "$b" ]

-gt

大于

if [ "$a" -gt "$b" ]

-ge

大于等于

if [ "$a" -ge "$b" ]

-lt

小于

if [ "$a" -lt "$b" ]

-le

小于等于

if [ "$a" -le "$b" ]

<

小于(在双括号里使用)

(("$a" < "$b"))

<=

小于等于(在双括号里使用)

(("$a" <= "$b"))

>

大于(在双括号里使用)

(("$a" > "$b"))

>=

大于等于(在双括号里使用)

下一页(("$a" >= "$b"))

字符串比較

=

等于

if [ "$a" = "$b" ]

==

等于

if [ "$a" == "$b" ]

与=等价.

==比較操作符在双中括号对和单中括号对中的行为是不同的.

 [[ $a == z* ]]
# 假设$a以"z"开头(模式匹配)那么结果将为真
[[ $a == "z*" ]] # 假设$a与z*相等(就是字面意思全然一样), 那
么结果为真. [ $a == z* ]
# 文件扩展匹配(file globbing)和单词切割有
效.
[ "$a" == "z*" ] # 假设$a与z*相等(就是字面意思全然一样), 那
#么结果为真.

!=

不等号

if [ "$a" != "$b" ]

这个操作符将在[[ ... ]]结构中使用模式匹配.

<

小于, 依照ASCII字符进行排序

if [[ "$a" < "$b" ]]

if [ "$a" \< "$b" ]

注意"<"使用在 [

] 结构中的时候须要被转义.

>

大于, 依照ASCII字符进行排序

if [[ "$a" > "$b" ]]

if [ "$a" \> "$b" ]

注意">"使用在 [

] 结构中的时候须要被转义.

參考样例 26-11, 这个样例展示了怎样使用这个比較操作符.

-z

字符串为"null", 意思就是字符串长度为零

-n

字符串不为"null".

当 -n 使用在中括号里进行条件測试的时候, 必需要把字符串用双引號引用起来. 假设採用了未引用的字符串来使用 ! -z , 甚至是在条件測试中括号(參

见样例 7-6)中仅仅使用未引用的字符串的话, 一般也是能够工作的, 然而,

这是一种不安全的习惯. 习惯于使用引用的測试字符串才是正路.

compound comparison

-a

逻辑与

exp1 -a exp2

假设表达式exp1和exp2都为真的话, 那么结果为真.

-o

逻辑或

exp1 -o exp2

假设表达式exp1和exp2中至少有一个为真的话, 那么结果为真.

这与Bash中的比較操作符&&和||很相像, 可是这个两个操作符是用在双中括号结构中的.

 [[ condition1 && condition2 ]]

-o和-a操作符一般都是和test命令或者是单中括号结构一起使用的.

 if [ "$exp1" -a "$exp2" ]

注意事项

 在一个混合測试中, 即使使用引用的字符串变量也可能还不够.

假设 $string 为空的话, [ -n "$string" -o "$a" = "$b" ] 可能会在某些版本号的Bash中产生

错误. 安全的做法是附加一个额外的字符给可能的空变量, [ "x$string" != x -o "x$a" =

"x$b" ] ("x"字符是能够相互抵消的).

Bash脚本中的操作符的更多相关文章

  1. grep 查找bash脚本中的注释代码

    出于安全性的考虑,不建议在bash脚本中注释掉不使用的代码.也就是说如果某段代码不使用了,那么应该删除掉,而不是简单地注释掉.假如你突然意识到这一点,而以前并没有遵从这个原则,现在需要找出脚本中的注释 ...

  2. 如何在Bash脚本中引入alias

    更多精彩内容,请关注微信公众号:后端技术小屋 alias的使用 在日常开发中,为了提高运维效率,我们会用alias(命令别名)来定义命令的简称.比如在~/.bash_profile中添加: alias ...

  3. bash 脚本中分号的作用

    在Linux bash shell中,语句中的分号一般用作代码块标识 1.单行语句一般要用到分号来区分代码块.比如: weblogic@pmtest:/$if [ "$PS1" ] ...

  4. Bash 脚本中的 set -euxo pipefail

    有些开发人员会用Bash来实现很复杂的功能,就像使用别的高级语言一样.他可能觉得自己很牛逼但其他人早就想锤爆他了,Bash的可读性和可维护性远远低于任何高级语言.更要命的是,Bash并没有方便的调试工 ...

  5. 详解在bash脚本中如何获取自身路径

    DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 这是stac ...

  6. bash脚本中的普通数组和关联数组

    1. 普通数组 bash支持一维数组(不支持多维数组),并且没有限定数组的大小.类似与C语言,数组元素的下标由0开始编号.获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0. ...

  7. linux 环境下bash脚本中找不到命令

    mr.sh: line 1: HADOOP_CMD: command not found mr.sh: line 4: INPUT_FILE_PATH: command not found mr.sh ...

  8. bash脚本中使用选项 getopts

    原文链接 : http://note.youdao.com/noteshare?id=0cf08484c7308c763726e63e9a638ff5&sub=EF6A110E2F3345E6 ...

  9. Bash脚本编程学习笔记04:测试命令test、状态返回值、位置参数和特殊变量

    我自己接触Linux主要是大学学习的Turbolinux --> 根据<鸟哥的Linux私房菜:基础篇>(第三版) --> 马哥的就业班课程.给我的感觉是这些课程对于bash的 ...

随机推荐

  1. ubuntu的home目录下,Desktop等目录消失不见

    第一步:创建相应的文件夹 首先当然是创建几个相应的英文文件夹喽,比如:Desktop.Downloads. Documents. Music. Pictures. Videos  , Template ...

  2. BZOJ 3910 并查集+线段树合并

    思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...

  3. C# net winform wpf 发送post数据和xml到网页

    由于项目需要发送数据到网页 这里用aspx做测试 采用post以及get发送数据,页面进行数据  首先这个东西很简单很简单,基本上学过的都会,但是原谅一直搞cs几乎不搞bs的猿类吧.三四年没接触bs. ...

  4. ComboxBox控件、checklistbox控件和listbox控件的组合开发

    第一步:先创建一个WinForm窗体应用程序,按照下图所示的进行布局. 第二步:为ComboxBox控件.checklistbox控件和listbox控件和button控件设置属性 第三步:在代码中的 ...

  5. Android 关于Toolbar和FragmentActivity的问题

    今天在工作中遇到用Fragment搭Tab框架时,FragmentActivity无法使用Toolbar的问题.查了许多资料,其实AppComponent继承自FragmentActivity,所以A ...

  6. 【Oracle】开、关、删归档日志(archivelog)

    归档日志:当redo日志发生切换时,归档进程(ARCn)会把redo日志自动归档,产生归档日志. 1.启动归档模式 –确定数据库为非归档模式 SYS@LGR> archive log list; ...

  7. highcharts例子

    直接看代码 <script language="JavaScript"> $(document).ready(function() { $.ajax({ type:'p ...

  8. setTimeout()传带有参数的函数

    w3cshool里的解释:setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,语法:setTimeout(code,millisec). 也就是说,第一个参数可以是字符串形式的Ja ...

  9. 【转】【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之集群概念介绍(一)

    原文地址:http://www.cnblogs.com/baiboy/p/orc1.html 阅读目录 目录 集群概念介绍 什么是集群 为什么搭建数据库集群 数据库集群的分类 可扩展的分布式数据库架构 ...

  10. Day 11 函数之对象和名称空间与作用域

    函数对象 函数是第一类对象,即函数可以被当做数据处理 函数对象的四大功能 1.引用 x=100 y=x def func() pass f=func print(f) #打印结果 #<funct ...