IT猫扑网:您身边最放心的安全下载站! 最新更新|软件分类|软件专题|手机版|论坛转贴|软件发布

您当前所在位置:首页操作系统LINUX → 鸟哥Linux私房菜之学习Shell Scripts(2)

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

时间:2015/6/28来源:IT猫扑网作者:网管联盟我要评论(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="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 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操作系统教程安装红帽子RedHat Linux9.0操作系统教程使用screen管理你的远程会话使用screen管理你的远程会话GNU/Linux安装vmwareGNU/Linux安装vmware如何登录linux vps图形界面 Linux远程桌面连如何登录linux vps图形界面 Linux远程桌面连

相关下载

人气排行 Linux下获取CPUID、硬盘序列号与MAC地址linux tc实现ip流量限制dmidecode命令查看内存型号linux下解压rar文件安装红帽子RedHat Linux9.0操作系统教程Ubuntu linux 关机、重启、注销 命令lcx.exe、nc.exe、sc.exe入侵中的使用方法查看linux服务器硬盘IO读写负载