利用 test 指令的测试功能

要检测系统上面某些文件或者是相关的属性时,利用 test 这个指令来工作真是好用得不 得了, 举例来说,我要检查 /dmtsai 是否存在时,使用:

[dmtsai@study ~]$ test -e /dmtsai

执行结果并不会显示任何讯息,但最后我们可以通过 $? 或 && 及 || 来展现整个结果。例如

[dmtsai@study ~]$ test -e /dmtsai && 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. 这个文件是否存在,若不存在则给 一个“Filenamedoesnotexist”的讯息,并中断程序;

  2. 若这个文件存在,则判断他是个文件或目录,结果输出“Filename is regularfile”或 “Filename is directory”

  3. 判断一下,执行者的身份对这个文件或目录所拥有的权限,并输出权限数据!

[dmtsai@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:~/bin
export 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}"

利用判断符号 [ ]

我们还可以利用判断符号“ [ ] ”(就是中括号啦) 来 进行数据的判断呢! 举例来说,如果我想要知道 ${HOME} 这个变量是否为空的,可以这样做:

[dmtsai@study ~]$ [ -z "${HOME}" ] ; echo $?

使用中括号必须要特别注意,因为中括号用在很多地方,包括万用字符与正则表达式等等, 所以如果要在 bash 的语法当中使用中括号作为 shell 的判断式时,必须要注意中括号的两端需要有空白字符来分隔。

所以说,要注意:

  • 在中括号 [] 内的每个元件都需要有空白键来分隔;
  • 在中括号内的变量,最好都以双引号括号起来;
  • 在中括号内的常数,最好都以单或双引号括号起来。

Shell script 的默认变量($0, $1...)

script 针对参数已经有设置好一些变量名称了!对应如下:

/path/to/scriptname  opt1  opt2  opt3  opt4
$0 $1 $2 $3 $4

除了这些数字的变量之外, 我们还有一些较为特殊的变量可以在 script 内使用来调用这些参数:

  • $# :代表后接的参数“个数”,以上表为例这里显示为“ 4 ”;

  • $@ :代表“ "$1" "$2" "$3" "$4" ”之意,每个变量是独立的(用双引号括起来);

  • $* :代表“ "$1c$2c$3c$4" ”,其中 c 为分隔字符,默 认为空白键, 所以本例中代表“ "$1 $2 $3 $4" ”之意。

  • shift:造成参数变量号码偏移

那个 shift 会移动变量,而且 shift 后面可以接数字,代表拿掉最前 面的几个参数的意思。

Linux学习-善用判断式的更多相关文章

  1. linux bash善用判断式

    1.利用 test 指令的测试功能 $ test -e hello.sh && echo "ok" || echo "no" ok 2.首先,判 ...

  2. Linux学习十八之、善用判断式

    原文地址:http://vbird.dic.ksu.edu.tw/linux_basic/0340bashshell-scripts_3.php 善用判断式 在第十一章中,我们提到过 $? 这个变量所 ...

  3. 第十三章、学习 Shell Scripts 善用判断式

    善用判断式 利用 test 命令的测试功能 我要检查 /dmtsai 是否存在时,使用: [root@www ~]# test -e /dmtsai [root@www ~]# test -e /dm ...

  4. Linux中的判断式

    格式一:test [参数] 判断内容格式二:[ [参数] 判断内容 ] 说明: a.格式二可以认为是格式一的缩写 b.格式二里中括号和内容之间要有空格 基于文件的判断-d 判断文件是否存在,并且是目录 ...

  5. Linux学习 - 条件判断

    一.判断格式 test -e /root/install.log 或 [ -e /root/install.log ] 使用echo $?查看是否正确,当返回0时表示返回正确 1 按照文件类型进行判断 ...

  6. linux学习书籍推荐《鸟哥的Linux私房菜》下载

    下载地址:点我 <鸟哥的Linux私房菜:基础学习篇>是具有知名度的Linux入门书<鸟哥的Linux私房菜基础学习篇>的最新版,全面而详细地介绍了Linux操作系统.< ...

  7. 第十三章、学习 Shell Scripts 条件判断式

    利用 if .... then 单层.简单条件判断式 if [ 条件判断式 ]; then 当条件判断式成立时,可以进行的命令工作内容: fi <==将 if 反过来写,就成为 fi !结束 i ...

  8. Linux学习之第十九、条件判断

    原文地址:http://vbird.dic.ksu.edu.tw/linux_basic/0340bashshell-scripts_4.php 条件判断式 只要讲到『程序』的话,那么条件判断式,亦即 ...

  9. Linux学习--第十一天--source、环境变量目录、欢迎信息、正则、cut、awk、sed、sort、判断表达式、if、for、case、一些脚本

    source source /root/.bashrc #让修改后的配置文件在不重启系统的情况下生效.source等同于. 环境变量目录 /etc/profile /etc/profile.d/*.s ...

随机推荐

  1. IQueryable和IEnumerable的区别

  2. HDP和包围曝光

    摄影笔记:http://mp.weixin.qq.com/s/6xgTtAcLAPkWY9FjqrfvtA 我们通过观察直方图曝光,尽量要直方图两边的纯黑和纯白区域不要有信息,就是亮的地方不死白,暗的 ...

  3. Java虚拟机内存分配与回收策略

    内存分配与回收策略 Minor GC 和 Full GC Minor GC:发生在新生代上,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行, 执行的速度一般也会比较快. Full GC ...

  4. CF1142A The Beatles

    思路: 令p表示步数,l表示步长.由于p是使(l * p) % (n * k) == 0的最小的p,所以p = (n * k) / gcd(n * k, l). 设l = k * x + r,则由题意 ...

  5. Kendo UI 单页面应用(二) Router 类

    Kendo UI 单页面应用(二) Router 类 Route 类负责跟踪应用的当前状态和支持在应用的不同状态之间切换.Route 通过 Url 的片段功能(#url)和流量器的浏览历史功能融合在一 ...

  6. 织梦channel标签中currentstyle不生效

    文件:/include/taglib/channel.lib.php line约133行:if( ($row['id']==$typeid || ($topid==$row['id'] &&a ...

  7. Linux系统日志分析

    Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出我们需要的信息. 大部分Linux发行版默认的日志守护进程为 syslog,位于 /etc/syslog 或 / ...

  8. Linux下如何修改用户默认目录

      Linux下默认的用户目录一般为/home/xxx(root用户除外),有些时候我们可能需要修改这个目录,下面我就给大家分享2中修改的方法 工具/原料 Linux操作系统 方法/步骤 1 1.切换 ...

  9. javaScript的注释、变量和基本数据类型

    上一级写了javaScript是用来操作文档对象元素的,这一次带大家看看javaScriput的注释.变量和基本数据类型. 1.注释:注释是什么呢?注释其实就是阻止浏览器解析某一行或者多行代码或描述的 ...

  10. hihoCoder #1050 : 树中的最长路

    题意: 求出树上最长路径的长度,并返回. 思路: 刚看到数据<=10^5,假如是单分支的树,那么有5万层,就不能递归,那就用桟实现, 那就要将长度信息保存在另开的数组中,很麻烦!!这题专门给递归 ...