1.一个 if/then 结构可以测试命令的返回值是否为 0(因为 0 表示成功),如果是的话,执行更多命令.有一个专用命令"["(左中括号,特殊字符).这个命令与 test 命令等价,但是出于效率上的考虑,它是一个内建命令.这个命令把它的参数作为比较表达式或是文件测试,并且根据比较的结果,返回一个退出码.
2.在版本 2.02 的 Bash 中,推出了一个新的[[...]]扩展 test 命令.因为这种表现形式可能对某些语言的程序员来说更加熟悉.注意"[["是一个关键字,并不是一个命令.Bash 把 [[ $a -lt $b ]]看作一个单独的元素,并且返回一个退出码.((...))和 let...结果也能够返回一个退出码,当它们所测试的算术表达式的结果为非 0 的时候,他们的退出码将返回 0或者true,当它们所测试的算术表达式的结果为0 的时候,他们的退出码将返回 1或者false。
3. If-then-else结构:
1 if [ condition-true ]
2 then
3 command 1
4 command 2
5 ...
6 else
7 # 可选的(如果不需要可以省去)
8 # 如果原始的条件测试结果是 false,那么添加默认的代码来执行.
9 command 3
10 command 4
11 ...
12 fi
注意:当 if 和 then 在一个条件测试的同一行中的话,必须使用";"来终止 if 表达式.if 和 then 都是关键字.关键字(或者命令)作为一个表达式的开头,并且在一个新的表达式开始之前,必须结束上一个表达式.
4.使用 if test condition-true 这种形式和 if[condition-true]这种形式是等价的.象我们前边所说的"["是 test 的标记.并且以"]"结束.在 if/test 中并不应该这么严厉,但是新版本的 Bash需要它.以下几个是等效命令 test,/usr/bin/test,[],和/usr/bin/[.
注意:在 if 后边,test 命令和[]或[[]]都不是必须的.如下:
1 dir=/home/bozo
2
3 if cd "$dir" 2>/dev/null; then # "2>/dev/null" hides error message.
4 echo "Now in $dir."
5 else
6 echo "Can't change to $dir."
7 fi
if 命令将返回 if 后边的命令的退出码.
与此相似,当在一个在使用与或列表结构的时候,test 或中括号的使用,也并不一定非的有 if 不可
1 var1=20
2 var2=22
3 [ "$var1" -ne "$var2" ] && echo "$var1 is not equal to $var2"
4
5 home=/home/bozo
6 [ -d "$home" ] || echo "$home directory does not exist."
5.[[]]结构比 Bash 的[]更加灵活,这是一个扩展的 test 命令,从 ksh88 继承过来的.在[[]]结构中,将没有文件扩展或者是单词分离,但是会发生参数扩展和命令替换.能够阻止脚本中的许多逻辑错误.
6. 文件测试操作
-e 文件存在
-a 文件存在。这个选项的效果与-e 相同.但是它已经被弃用了,并且不鼓励使用
-f file 是一个 regular 文件(不是目录或者设备文件)
-s 文件长度不为 0
-d 文件是个目录
-b 文件是个块设备(软盘,cdrom 等等)
-c 文件是个字符设备(键盘,modem,声卡等等)
-p 文件是个管道
-h 文件是个符号链接
-L 文件是个符号链接
-S 文件是个 socket
-t 关联到一个终端设备的文件描述符。这个选项一般都用来检测是否在一个给定脚本中的 stdin[-t0]或[-t1]是一个终端
-r 文件具有读权限(对于用户运行这个 test)
-w 文件具有写权限(对于用户运行这个 test)
-x 文件具有执行权限(对于用户运行这个 test)
-g set-group-id(sgid)标志到文件或目录上。如果一个目录具有 sgid 标志,那么一个被创建在这个目录里的文件,这个目录属于创建这个目录的用户组,并不一定与创建这个文件的用户的组相同.对于 workgroup 的目录共享来说,这非常有用.
-u set-user-id(suid)标志到文件上。如果运行一个具有 root 权限的文件,那么运行进程将取得 root 权限,即使你是一个普通用户.[1]这对于需要存取系统硬件的执行操作(比如 pppd 和 cdrecord)非常有用.如果没有 suid 标志的话,那么普通用户(没有 root 权限)将无法运行这种程序.
-rwsr-xr-t 1 root 178236 Oct 2 2000 /usr/sbin/pppd
对于设置了 suid 的文件,在它的权限标志中有"s".
-k 设置粘贴位,见<>第 65 页.对于"sticky bit",save-text-mode 标志是一个文件权限的特殊类型.如果设置了这个标志,那么这个文件将被保存在交换区,为了达到快速存取的目的.如果设置在目录中,它将限制写权限.对于设置了 sticky bit 位的文件或目录,权限标志中有"t".
drwxrwxrwt 7 root 1024 May 19 21:26 tmp/
如果一个用户并不时具有 stick bit 位的目录的拥有者,但是具有写权限,那么用户只能在这个目录下删除自己所拥有的文件.这将防止用户在一个公开的目录中不慎覆盖或者删除别人的文件,比如/tmp(当然 root 或者是目录的所有者可以随便删除或重命名其中的文件).
-O 你是文件的所有者.
-G 文件的 group-id 和你的相同.
-N 从文件最后被阅读到现在,是否被修改.
f1 -nt f2 文件 f1 比 f2 新
f1 -ot f2 f1 比 f2 老
f1 -ef f2 f1 和 f2 都硬连接到同一个文件.
! 非--反转上边测试的结果(如果条件缺席,将返回 true)
阅读(469) | 评论(0) | 转发(0) |