Bash脚本中的操作符

一、文件测试操作符

如果下面的条件成立将会返回真.

-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"字符是可以相互抵消的).

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2025-01-06 06:43:05

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

bash脚本中出现[[:not found错误的解决方法

bash脚本中出现[[:not found错误的解决方法--bash脚本总结1 今天在写脚本的时候,发生了一个奇怪的问题:在脚本中使用[[的时候报错“[[: not found”.遇到问题自然是解决问题. 1. 使用的bash版本太低? bash --version查看bash版本信息如下 [email protected]:~$bash --version GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu) Copyright (C)

bash脚本中单行及多行注释方法

一:单行注释直接在行首加"#" 如: #我是注释行 二.多行注释利用:空命令 注意:以下方法中如果在注释中出现反引号引用的命令将会执行,存在风险. 1.把输入重定义到前面的命令,但是":" 是空命令,所以就相当于注释了. :<<BLOCK ....我是注释内容 ....我是注释内容 ....我是命令`mkdir test` ....我是注释内容 BLOCK 2.类似于建一本地文件,然后对它执行空命令,什么也不做,亦即是相当于注释了 :<<WO

bash脚本编程之在bash脚本中使用选项

[[email protected] ~]# vim a #!/bin/bash # Name:abc # Description:Create script # Author:mylinux # Version:0.0.1 # Datatime:03/02/12 14:42:00 # Usage:mkscript FILENAME cat >$1  <<EOF #!/bin/bash # Name: `basename $1` # Description: # Author: myli

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

mr.sh: line 1: HADOOP_CMD: command not found mr.sh: line 4: INPUT_FILE_PATH: command not found mr.sh: line 6: OUTPUT_PATH: command not found mr.sh: line 8: fs: command not found Illegal option: / Usage: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file

从此编写 Bash 脚本不再难【转】

从此编写 Bash 脚本不再难 原创 Linux技术 2017-05-02 14:30 在这篇文章中,我们会介绍如何通过使用 bash-support vim 插件将 Vim 编辑器安装和配置 为一个编写 Bash 脚本的 IDE. -- Aaron Kili 本文导航 -什么是 bash-support.vim 插件? …… 05% -如何在 Linux 中安装 Bash-support 插件 …… 10% -如何在 Vim 编辑器中使用 Bash-support 插件 …… 17% -如何为

Linux下shell脚本中信号捕获和函数练习脚本之ping一个网段

该脚本主要的目的是练习在Linux bash脚本中捕获信号,顺便练习一下函数的使用,还有就是终止一个正在运行的程序后,该程序打开的文件的后续处理问题等等! 脚本功能: ping一个网段内的IP,检测哪些IP在线,哪些IP不在线 练习的命令: 1.mktemp 用法:#mktemp 1117.www.qixoo.qixoo.com/Path/To/SomeFile.XXX 其中XXX可以为多个,是由系统随机生成的一段字符串 -d  创建为目录 2.ping 测试网络是否通畅 用法:#ping [-

bash脚本编程实践总结(图文)

从操作系统层面来说,shell是一个"壳",人机交互接口,实质上shell就是命令解释器,解析用户输入的命令,进而达到人机交互的功能 bash编程语言属于弱类型编程语言,不区分数据类型,所有数据默认当做字符处理,若要做运算处理,则需要使用算术表达式,同时也是过程式编程语言,以指令为中心,围绕指令设计数据 过程式编程语言:        顺序执行        选择执行        循环执行 shell编程本质:语法结构+命令堆积 脚本编写:    首行定顶格给出shebang(这是个

Bash脚本的空格和“期待一元表达式”错误

很少自己写Bash脚本,一写就出现了一些奇怪的问题,主要还是对Bash脚本的语法不够熟悉,毕竟很少使用. 当做记录一下吧,今天因为空格导致的一些脚本问题: 1.Bash脚本中的赋值符号"="前后不能有空格.例如给变量number赋值要写成"number=1",不能写成"number = 1".大多数编程语言都会忽略掉一些没有意义的空格,例如对于Java语言上面两种写法在语法上都是正确,但是Bash脚本不会. 2.Bash脚本中的"[&q

bash 脚本

一 创建shell脚本 1 创建包含bash命令的文本文件 #!/bin/bash###写在文件的第一行,说明用什么解释器,来解释以下写的内容### 2 chmod  +x scripts 3  将文件放置在用户的$PATH的目录中 ~/bin – 用于用户的私有程序 /usr/local/bin – 本地开发.系统上的其他人使用的脚本 /usr/local/sbin - 本地开发.由root使用的脚本 直接运行脚本和使用source命令运行脚本是不同的! [[email protected]