v>

shell脚本test


$?变量代表的意义, 通过 && 及 || 来作为前一个指令执行回传值对于后一个指令是否要进行的依据。 如果想要判断一个目录是否存在, 使用ls指令搭配数据流重导向,最后配合$?来决定后续的指令进行与否。 可以使用test命令更简单的方式可以来进行条件判断。
利用 test 指令的测试功能
利用test指令检测系统上面某些文件或者是相关的属性,例如检查/peter是否存在:
            [peter@study ~]$ test -e /peter
            
执行结果并不会显示任何讯息,可以通过$?或&&及||来展现整个结果!
例如将上面的例子改成这样:
            [peter@study ~]$ test -e /peter && echo "exist" || echo "Not exist"
            Not exist
            
结果显示不存在!
-e是测试一个东西在不在,如果想要测试一下该文件名是啥玩意儿时,还有哪些标志可以来判断的呢?!
测试的标志 代表意义
1. 关于某个文件名的文件类型判断,如 test -e filename 表示存在否
-e 该文件名是否存在?(常用)
-f 该文件名是否存在且为文件(file)?(常用)
-d 该文件名是否存在且为目录(directory)?(常用)
-b 该文件名是否存在且为一个 block device 装置?
-c 该文件名是否存在且为一个 character device 装置?
-S 该文件名是否存在且为一个 Socket 文件?
-p 该文件名是否存在且为一个 FIFO (pipe) 文件?
-L 该文件名是否存在且为一个连结档?
2. 关于文件的权限侦测,如 test -r filename 表示可读否 (但 root 权限常有例外)
-r 侦测该文件名是否存在且具有可读的权限?
-w 侦测该文件名是否存在且具有可写的权限?
-x 侦测该文件名是否存在且具有可执行的权限?
-u 侦测该文件名是否存在且具有SUID的属性?
-g 侦测该文件名是否存在且具有SGID的属性?
-k 侦测该文件名是否存在且具有Sticky bit的属性?
-s 侦测该文件名是否存在且为非空白文件?
3. 两个文件之间的比较,如: test file1 -nt file2
-nt (newer than)判断 file1 是否比 file2 新
-ot (older than)判断 file1 是否比 file2 旧
-ef 判断 file1 与 file2 是否为同一文件,可用在判断 hard link 的判定上。主要意义在判定,两个文件是否均指向同一个inode哩!
4. 关于两个整数之间的判定,例如 test n1 -eq n2
-eq 两数值相等 (equal)
-ne 两数值不等 (not equal)-gt n1 大于 n2 (greater than)
-lt n1 小于 n2 (less than)
-ge n1 大于等于 n2 (greater than or equal)
-le n1 小于等于 n2 (less than or equal)
5. 判定字符串的数据
test -z string 判定字符串是否为 0 ?若 string 为空字符串,则为 true
test -n string 判定字符串是否非为 0 ?若 string 为空字符串,则为 false。
注: -n 亦可省略
test str1 == str2 判定 str1 是否等于 str2 ,若相等,则回传 true
test str1 != str2 判定 str1 是否不等于 str2 ,若相等,则回传 false
6. 多重条件判定,例如: test -r filename -a -x filename
-a (and)两状况同时成立!例如 test -r file -a -x file,则 file 同时具有 r 与 x 权限时,才回传 true。
-o (or)两状况任何一个成立!例如 test -r file -o -x file,则 file 具有 r 或 x 权限时,就可回传 true。
! 反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true
首先,判断一下,让用户输入一个文件名,我们判断:
1. 这个文件是否存在,若不存在则给予一个Filename does not exist的讯息,并中断程序;
2. 若这个文件存在,则判断他是个文件或目录,结果输出Filename is regular file或 Filename is directory
3. 判断一下,执行者的身份对这个文件或目录所拥有的权限,并输出权限数据!
注意利用test与&&还有||等标志:
[peter@study bin]$ vim file_perm.sh
#!/bin/bash
# Program:
# User input a filename, program will check the flowing:
# 1.) exist? 2.) file/directory? 3.) file permissions
# History:
# 2015/07/16 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATH
# 1. 让用户输入文件名,并且判断用户是否真的有输入字符串?
echo -e "Please input a filename, I will check the filename's type and permission. \n\n"
read -p "Input a filename : " filename
test -z ${filename} && echo "You MUST input a filename." && exit 0
# 2. 判断文件是否存在?若不存在则显示讯息并结束脚本
test ! -e ${filename} && echo "The filename '${filename}' DO NOT exist" && exit 0
# 3. 开始判断文件类型与属性
test -f ${filename} && filetype="regulare file"
test -d ${filename} && filetype="directory"
test -r ${filename} && perm="readable"
test -w ${filename} && perm="${perm} writable"
test -x ${filename} && perm="${perm} executable"
# 4. 开始输出信息!
echo "The filename: ${filename} is a ${filetype}" echo "And the permissions for you are : ${perm}"
脚本依据输入的文件名来进行检查!先看是否存在,再看为文件或目录类型,最后判断权限。
建议使用一般使用者来执行这个脚本。
由于root在很多权限的限制上面都是无效的,使用root执行该脚本时,常常会发现与ls -l观察到的结果并不相同!
利用判断符号 [ ]
除了test外,还可以利用判断符号[ ](中括号)来进行数据的判断! 如果要知道${HOME}这个变量是否为空的,可以这样做:
            [peter@study ~]$ [ -z "${HOME}" ] ; echo $?
            
中括号用在很多地方,包括通配符与正则表达式等,中括号作为shell的判断式,括号的两端需要有空格符来分隔!
假设我空格键使用□符号来表示,那么,在这些地方你都需要有空格键:
[空格"$HOME"空格==空格"$MAIL"空格]
[ "$HOME" == "$MAIL" ]
上面的判断式使用了两个等号== 。其实在bash当中使用一个等号与两个等号的结果是一样的!
不过在一般惯用程序的写法中,一个等号代表变量的设定,两个等号则是代表逻辑判断。
由于我们在中括号内重点在于判断而非设定变量,因此建议您还是使用两个等号!
上面在说明两个字符串${HOME}与${MAIL}是否相同的意思,相当于test ${HOME} == ${MAIL}!
如果没有空白分隔,例如[${HOME}==${MAIL}],bash就会显示错误讯息!
要注意:
在中括号 [] 内的每个组件都需要有空格键来分隔;
在中括号内的变数,最好都以双引号括号起来;
在中括号内的常数,最好都以单或双引号括号起来。
假如设定了 name="VBird Tsai" ,然后这样判定:
            [peter@study ~]$ name="VBird Tsai"
            [peter@study ~]$ [ ${name} == "VBird" ]
            bash: [: too many arguments
            
如果${name}没有使用双引号刮起来,上面的判定式会变成:
[ VBird Tsai == "VBird" ]
bash说错误是由于太多参数(arguments)所致!应该是下面这样:
[ "VBird Tsai" == "VBird" ]
中括号的使用方法与test几乎一模一样~ 只是中括号比较常用在条件判断式if ..... then ..... fi中。
我们使用中括号的判断来做一个小案例:
1. 当执行一个程序的时候,这个程序会让用户选择 Y 或 N ,
2. 如果用户输入 Y 或 y 时,就显示 OK, continue
3. 如果用户输入 n 或 N 时,就显示 Oh, interrupt !
4. 如果不是 Y/y/N/n 之内的其他字符,就显示 I don't know what your choice is
利用中括号、 && 与 ||:
[peter@study bin]$ vim ans_yn.sh
#!/bin/bash
# Program:
# This program shows the user's choice
# History:
# 2015/07/16 VBird
First releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Please input (Y/N): " yn
[ "${yn}" == "Y" -o "${yn}" == "y" ] && echo "OK, continue" && exit 0
[ "${yn}" == "N" -o "${yn}" == "n" ] && echo "Oh, interrupt!" && exit 0
echo "I don't know what your choice is" && exit 0
输入正确(Yes)的方法有大小写之分,不论输入大写Y或小写y都是可以的,此时判断式内就得要有两个判断才行!
由于是任何一个成立即可(大写或小写的 y) ,所以这里使用-o(或)连结两个判断!
利用这个字符串判别的方法,我们就可以很轻松的将用户想要进行的工作分门别类!

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读