码迷,mamicode.com
首页 > 其他好文 > 详细

Bash脚本中的操作符

时间:2015-06-27 16:47:41      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:

一、文件测试操作符
如果下面的条件成立将会返回真.
-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脚本中的操作符

标签:

原文地址:http://blog.csdn.net/q3733353520/article/details/46659701

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!