IT猫扑网:您身边最放心的安全下载站! 最新更新| 软件分类| 专题汇总| 手机版

您当前所在位置:IT猫扑网 > 操作系统 > LINUX > 鸟哥Linux私房菜之学习Shell Scripts(2)

鸟哥Linux私房菜之学习Shell Scripts(2)

时间:2015-06-28 00:00 来源:IT猫扑网|http://www.itmop.com/ 作者:网管联盟 我要评论(0)

  善用判断式

  在 bash 章节中,我们提到过 $? 这个变量所代表的意义, 此外,也透过 && 及 || 来作为前一个指令是否能够成功进行的一个参考。 那么,如果我想要知道 /dmtsai 这个目录是否存在时,难道一定要使用 ls 来执行, 然后再以 $? 来判断执行成果吗?呵呵!当然不需要! 我们可以透过『 test 』这个指令来侦测呢!

  --------------------------------------------------------------------------------

  利用 test 指令的测试功能

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

  [root@linux ~]# test -e /dmtsai

  执行结果并不会显示任何讯息,但最后我们可以透过 $? 或 && 及 || 来展现整个结果呢! 例如我们在将上面的例子改写成这样:

  [root@linux ~]# test -e /dmtsai && echo &exist& || echo &Not exist&

  最终的结果可以告知我们是『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

  -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 判断 file2 与 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

  OK!现在我们就利用 test 来帮我们写几个简单的例子。首先,判断一下, 让使用者输入一个档名,我们判断:

#p#副标题#e#

  这个档案是否存在,若不存在则给予一个『Filename does not exist』的讯息,并中断程序;

  若这个档案存在,则判断他是个档案或目录,结果输出『Filename is regular file』或 『Filename is directory』

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

  你可以先自行创作看看,然后再跟底下的结果讨论讨论。注意利用 test 与 && 还有 || 等标志!

  [root@linux scripts]# vi sh05.sh

  #!/bin/bash

  # Program:

  # Let user input a filename, the program will search the filename

  #  1.) exist? 2.) file/directory? 3.) file permissions

  # History:

  # 2005/08/25  vbird  First release

  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

  export PATH

  # 1. 让使用者输入档名,并且判断使用者是否真的有输入字符串?

  echo -e &The program will show you that filename is exist which input by you. &

  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=®ulare 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 permission are : $perm&

  很有趣的例子吧!您可以自行再以其它的案例来撰写一下可用的功能呢!

  --------------------------------------------------------------------------------

  利用判断符号 [ ]

  除了我们很喜欢使用的 test 之外,其实,我们还可以利用判断符号『 [ ] 』来进行数据的判断呢! 举例来说,如果我想要知道 $HOME 这个变量是否为空的,可以这样做:

  [root@linux ~]# [ -z &$HOME& ]

  但使用 [] 要特别注意的是,在上述的每个组件中间都需要有空格键来分隔,假设我空格键使用『□』来表示, 那么,在这些地方你都需要有空格键:

  [  &$HOME&  ==  &$MAIL&  ]

  [□&$HOME&□==□&$MAIL&□]

  ↑ ↑  ↑ ↑

  上面的例子在说明,两个字符串 $HOME 与 $MAIL 是否相同的意思,相当于 test $HOME = $MAIL 的意思啦! 而如果没有空白分隔,例如 [$HOME==$MAIL] 时,我们的 bash 就会显示错误讯息了!这可要很注意啊! 所以说,您最好要注意:

  在中括号 [] 内的每个组件都需要有空格键来分隔;

  在中括号内的变量,最好都以双引号来设定;

  在中括号内的常数,最好都以单或双引号来设定。

  举例来说,假如我设定了 name=&VBird Tsai& ,然后这样判定:

  [root@linux ~]# name=&VBird Tsai&

  [root@linux ~]# [ $name == &VBird& ]

  bash: [: too many arguments

  为什么呢?因为 $name 如果没有使用双引号刮起来,那么上面的判定式会变成:

  [ VBird Tsai == &VBird& ]

  而不是我们要的:

  [ &VBird Tsai& == &VBird& ]

  这可是差很多的喔!另外,中括号的使用方法与标志与 test 几乎一模一样啊~ 只是中括号比较常用在条件判断式 if ..... then ..... fi 的情况中就是了。 好,那我们也继续来做一个小案例好了:

  当执行一个程序的时候,这个程序会让使用者选择 Y 或 N ,

  如果使用者输入 Y 或 y 时,就显示『 OK, continue 』

  如果使用者输入 n 或 N 时,就显示『 Oh, interrupt !』

  如果不是 Y/y/N/n 之内的其它字符,就显示『I don't know what is your choise』

  利用中括号、 && 与 || 来继续吧!

#p#副标题#e#

  [root@linux scripts]# vi sh06.sh

  #!/bin/bash

  # Program:

  # This program will show the user's choice

  # History:

  # 2005/08/25  VBird   

关键词标签:Linux,Shell Scripts

相关阅读 安装红帽子RedHat Linux9.0操作系统教程 Tomcat9.0如何安装_Tomcat9.0环境变量配置方法 多种操作系统NTP客户端配置 Linux操作系统修改IP Linux实现SCSI硬盘热插拔及在线识别 Linux下用CDMA modem拨号上网

文章评论
发表评论

热门文章 安装红帽子RedHat Linux9.0操作系统教程 安装红帽子RedHat Linux9.0操作系统教程 Linux服务器:设计高性能网站架构-LLMP Linux服务器:设计高性能网站架构-LLMP 使用Clonezilla迁移到虚拟Linux环境 使用Clonezilla迁移到虚拟Linux环境 Linux上的MRTG流量监控中心 Linux上的MRTG流量监控中心 Linux 双网卡绑定一个IP原理及实现 Linux 双网卡绑定一个IP原理及实现 linux和windows等系统远程控制ubuntu桌面 linux和windows等系统远程控制ubuntu桌面

相关下载

人气排行 Linux下获取CPUID、硬盘序列号与MAC地址 dmidecode命令查看内存型号 linux tc实现ip流量限制 安装红帽子RedHat Linux9.0操作系统教程 linux下解压rar文件 lcx.exe、nc.exe、sc.exe入侵中的使用方法 Ubuntu linux 关机、重启、注销 命令 查看linux服务器硬盘IO读写负载 linux命令行浏览器的使用方法 Linux NFS服务固定端口及防火墙配置 U盘安装Ubuntu 10.04 Linux清除用户登录记录和命令历史方法