test 文件运算符
利用这些运算符,您可以在程序中根据对文件类型的评估结果执行不同的操作:test 文件运算符利用这些运算符,您
-b file 如果文件为一个块特殊文件,则为真
-c file 如果文件为一个字符特殊文件,则为真不同的操作: -b file 如果文件为
-d file 如果文件为一个目录,则为真
-e file 如果文件存在,则为真
-f file 如果文件为一个普通文件,则为真一个块特殊文件,则为真 -c file
-g file 如果设置了文件的 SGID 位,则为真
-G file 如果文件存在且归该组所有,则为真
-k file 如果设置了文件的粘着位,则为真test 文件运算符利用这些运算符,您
-O file 如果文件存在并且归该用户所有,则为真
-p file 如果文件为一个命名管道,则为真
-r file 如果文件可读,则为真不同的操作: -b file 如果文件为
-s file 如果文件的长度不为零,则为真
-S file 如果文件为一个套接字特殊文件,则为真
-t fd 如果 fd 是一个与终端相连的打开的文件描述符(fd 默认为 1),则为真可以在程序中根据对文件类型的评估结果执行
-u file 如果设置了文件的 SUID 位,则为真
-w file 如果文件可写,则为真
-x file 如果文件可执行,则为真一个块特殊文件,则为真 -c file
以下示例显示了此简单操作的运行情况:
test 文件运算符利用这些运算符,您$ ls -l
total 33
drwxr-xr-w 2 root root 1024 Dec 5 05:05 LST一个块特殊文件,则为真 -c file
-rw-rw-rw- 1 emmett users 27360 Feb 6 07:30 evan
-rwsrwsrwx 1 root root 152 Feb 6 07:32 hannah
drwxr-xr-x 2 emmett users 1024 Feb 6 07:31 karentest 文件运算符利用这些运算符,您
-rw------- 1 emmett users 152 Feb 6 07:29 kristin
-rw-r--r-- 1 emmett users 152 Feb 6 07:29 spencer
$test 文件运算符利用这些运算符,您
$ test -r evan
$ echo $?一个块特殊文件,则为真 -c file
0
$ test -r walter一个块特殊文件,则为真 -c file
$ echo $?
1
$不同的操作: -b file 如果文件为
由于第一次评估为真 — 文件存在且可读 — 返回值为真,或 0。由于第二次评估的文件不存在,该值为假,返回值不为零。将值指定为零或非零很重要,因为在失败时不会始终返回 1(虽然这是通常返回的值),可能返回一个非零值。
不同的操作: -b file 如果文件为正如开头所提到的,除了使用 test 外,您还可以用方括号 [ ] 将命令括住来向 shell 发出同样的命令 — 如下所示:
$ [ -w evan ]如果文件为一个字符特殊文件,则为真 -d
$ echo $?
0
$ [ -x evan ]test 文件运算符利用这些运算符,您
$ echo $?
1
$可以在程序中根据对文件类型的评估结果执行
同样,第一个表达式为真,第二个表达式为假 — 正如返回值所指示的那样。您还可以使用以下命令将两个文件彼此进行比较:
可以在程序中根据对文件类型的评估结果执行file1 -ef file2 测试以判断两个文件是否与同一个设备相连,是否拥有相同的 inode 编号
file1 -nt file2 测试以判断第一个文件是否比第二个文件更新(由修改日期决定)
file1 -ot file2 测试以判断第一个文件是否比第二个文件更旧test 文件运算符利用这些运算符,您
以下示例显示了使用这些运算符比较文件的结果:
test 文件运算符利用这些运算符,您$ [ evan -nt spencer ]
$ echo $?
0一个块特殊文件,则为真 -c file
$ [ karen -ot spencer ]
$ echo $?
1一个块特殊文件,则为真 -c file
$
名为 evan 的文件比名为 spencer 的文件更新,因而评估为真。类似地,名为 karen 的文件比名为 spencer 的文件更新,因此该评估为假。test 文件运算符利用这些运算符,您
字符串比较运算符
一个块特殊文件,则为真 -c file 如标题所示,这组函数比较字符串的值。您可以检查它们是否存在、是否相同或者是否不同。
String 测试以判断字符串是否不为空不同的操作: -b file 如果文件为
-n string 测试以判断字符串是否不为空;字符串必须为 test 所识别
-z string 测试以判断字符串是否为空;字符串必须为 test 所识别
string1 = string2 测试以判断 string1 是否与 string2 相同不同的操作: -b file 如果文件为
string1 != string2 测试以判断 string1 是否与 string2 不同
对任何变量进行的最有用的测试之一是判断它的值是否不为空,可以简单地将其放在 test 命令行中执行这种测试,如下例所示:test 文件运算符利用这些运算符,您
$ test "$variable"
不同的操作: -b file 如果文件为强烈建议进行此种测试时用双引号将变量括住,以让 shell 识别变量(即使变量为空)。默认情况下执行的基本字符串评估和 -n 测试从功能上讲是相同的,如以下示例所示:
#example1
if test -n "$1"test 文件运算符利用这些运算符,您
then
echo "$1"
fi不同的操作: -b file 如果文件为
执行以上例子中的代码将根据 $1 是否存在给出以下结果:
test 文件运算符利用这些运算符,您$ example1 friday
friday
$不同的操作: -b file 如果文件为
$ example1
$
如果文件为一个字符特殊文件,则为真 -d如果将代码更改为以下形式,则结果将相同:
#example2一个块特殊文件,则为真 -c file
if test "$1"
then
echo "$1"不同的操作: -b file 如果文件为
fi
如下所示:可以在程序中根据对文件类型的评估结果执行
$ example2 friday
friday可以在程序中根据对文件类型的评估结果执行
$
$ example2
$如果文件为一个字符特殊文件,则为真 -d
所有这些表明,通常不需要 -n,它代表默认操作。
不同的操作: -b file 如果文件为要从一个不同的角度来查看各种可能性,您可以用另一个选项来替换 -n,并检查该值是否为空(相对于非空)。这可以用 -z 选项来实现,代码为:
#example3test 文件运算符利用这些运算符,您
if test -z "$1"
then
echo "no values were specified"不同的操作: -b file 如果文件为
fi
运行如下:不同的操作: -b file 如果文件为
$ example3
no values were specified如果文件为一个字符特殊文件,则为真 -d
$ example3 friday
$
如果文件为一个字符特殊文件,则为真 -d如果在没有命令行参数的情况下运行该程序,而表达式评估为真,那么将执行程序块中的文本。如果在命令行中有值,则脚本退出,不执行任何操作。将评估操作放在脚本的开头非常有用,这可以在可能产生错误的进一步处理之前预先检查变量值。
其余的字符串运算符对两个变量/字符串之间的精确匹配或其中的差异(您也可以称之为等价性和“不等价性”)进行评估。第一个例子对匹配进行测试:不同的操作: -b file 如果文件为
$ env
LOGNAME=emmett不同的操作: -b file 如果文件为
PAGER=less
SHELL=/bin/bash
TERM=linux一个块特殊文件,则为真 -c file
$
$ [ "$LOGNAME" = "emmett" ]
$ echo $?可以在程序中根据对文件类型的评估结果执行
0
$
$ [ "$LOGNAME" = "kristin" ]不同的操作: -b file 如果文件为
$ echo $?
1
$test 文件运算符利用这些运算符,您
或者,该评估可以以脚本的形式用于决定是否运行脚本:
如果文件为一个字符特殊文件,则为真 -d#example4
if [ "$LOGNAME" = "emmett" ]
then如果文件为一个字符特殊文件,则为真 -d
echo "processing beginning"
else
echo "incorrect user"test 文件运算符利用这些运算符,您
fi
这种方法可以用来寻找任意的值(如终端类型或 shell 类型),在允许脚本运行之前这些值必须匹配。请注意,= 或 != 运算符的优先级高于其它大多数可指定选项,且要求必须伴有表达式。因此,除了比较字符串的选项之外,= 或 != 都不能和检查某种东西(如可读文件、可执行文件或目录)的存在性的选项一起使用。
转载于:http://blog.itpub.net/24558279/viewspace-752896/