第十三章、学习 Shell Scripts 善用判断式
善用判断式
利用 test 命令的测试功能
我要检查 /dmtsai 是否存在时,使用:
[root@www ~]# test -e /dmtsai |
[root@www ~]# test -e /dmtsai && echo "exist" || echo "Not exist" |
| 测试的标志 | 代表意义 |
| 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 |
现在我们就利用 test 来帮我们写几个简单的例子。首先,判断一下,让使用者输入一个档名,我们判断:
- 这个文件是否存在,若不存在则给予一个『Filename does not exist』的信息,并中断程序;
- 若这个文件存在,则判断他是个文件或目录,结果输出『Filename is regular file』或
『Filename is directory』 - 判断一下,运行者的身份对这个文件或目录所拥有的权限,并输出权限数据!
[root@www scripts]# vi sh05.sh |
利用判断符号 [ ]
[root@www ~]# [ -z "$HOME" ] ; echo $? |
果要在 bash 的语法当中使用中括号作为 shell 的判断式时,必须要注意中括号的两端需要有空白字节来分隔! 假设我空白键使用『□』符号来表示,那么,在这些地方你都需要有空白键:
[ "$HOME" == "$MAIL" ] |
| Tips: bash 当中使用一个等号与两个等号的结果是一样的! 不过在一般惯用程序的写法中,一个等号代表『变量的配置』,两个等号则是代表『逻辑判断 (是否之意)』。 |
- 在中括号 [] 内的每个组件都需要有空白键来分隔;
- 在中括号内的变量,最好都以双引号括号起来;
- 在中括号内的常数,最好都以单或双引号括号起来。
[root@www ~]# name="VBird Tsai" |
因为 $name 如果没有使用双引号刮起来,那么上面的判定式会变成:
[ VBird Tsai == "VBird" ]
因为一个判断式仅能有两个数据的比对,上面 VBird 与 Tsai 还有 "VBird" 就有三个数据! 这不是我们要的!我们要的应该是底下这个样子:
[ "VBird Tsai" == "VBird" ]
中括号比较常用在条件判断式 if ..... then ..... fi 的情况中就是了。
- 当运行一个程序的时候,这个程序会让使用者选择 Y 或 N ,
- 如果使用者输入 Y 或 y 时,就显示『 OK, continue 』
- 如果使用者输入 n 或 N 时,就显示『 Oh, interrupt !』
- 如果不是 Y/y/N/n 之内的其他字节,就显示『 I don't know what your choice is 』
[root@www scripts]# vi sh06.sh |
Shell script 的默认变量($0, $1...)
[root@www ~]# file /etc/init.d/syslog |
/path/to/scriptname opt1 opt2 opt3 opt4 |
- $# :代表后接的参数『个数』,以上表为例这里显示为『 4 』;
- $@ :代表『 "$1" "$2" "$3" "$4" 』之意,每个变量是独立的(用双引号括起来);
- $* :代表『 "$1c$2c$3c$4" 』,其中 c 为分隔字节,默认为空白键, 所以本例中代表『 "$1 $2 $3 $4" 』之意。
- 程序的档名为何?
- 共有几个参数?
- 若参数的个数小於 2 则告知使用者参数数量太少
- 全部的参数内容为何?
- 第一个参数为何?
- 第二个参数为何
[root@www scripts]# vi sh07.sh |
运行结果如下:
[root@www scripts]# sh sh07.sh theone haha quot |
- shift:造成参数变量号码偏移
[root@www scripts]# vi sh08.sh |
这玩意的运行成果如下:
[root@www scripts]# sh sh08.sh one two three four five six <==给予六个参数 |
shift 后面可以接数字,代表拿掉最前面的几个参数的意思。
第十三章、学习 Shell Scripts 善用判断式的更多相关文章
- 第十三章、学习 Shell Scripts 条件判断式
利用 if .... then 单层.简单条件判断式 if [ 条件判断式 ]; then 当条件判断式成立时,可以进行的命令工作内容: fi <==将 if 反过来写,就成为 fi !结束 i ...
- 第十三章、学习 Shell Scripts
什么是 Shell scripts shell script (程序化脚本) :shell script 是针对 shell 所写的『脚本!』 shell script 是利用 shell 的功能所写 ...
- 鸟哥的Linux私房菜——第十六章:学习Shell Scripts
视频链接:http://www.bilibili.com/video/av10565321/ 1. 什么是 Shell Script (shell写的脚本)1.1 干嘛学习 shell s ...
- 鸟哥的Linux私房菜-第10/11/12/13章(vim程序编辑器、学习bash、正则表达式与文件格式化处理、学习Shell Scripts)
第10章 vim程序编辑器 可以将vim看做vi的进阶版本,vim可以用颜色或底线等方式来显示出一些特殊的信息. 为何要学习vim?因为: a. 所有的 Unix Like 系统都会内建 vi 文书编 ...
- Linux学习十八之、善用判断式
原文地址:http://vbird.dic.ksu.edu.tw/linux_basic/0340bashshell-scripts_3.php 善用判断式 在第十一章中,我们提到过 $? 这个变量所 ...
- 第13章 学习shell script
由于博客园中dollar符号有别的意义,所以文中的dollar符号使用¥表示 第一个script [root@localhost script]# cat -n sh01.sh #!/bin/bash ...
- 第十三章、学习 Shell Scripts 循环 (loop)
while do done, until do done (不定循环) while [ condition ] <==中括号内的状态就是判断式 do <==do 是回圈的开始! 程序段落 ...
- 《Linux命令行与shell脚本编程大全》 第二十三章 学习笔记
第二十三章:使用数据库 MySQL数据库 MySQL客户端界面 mysql命令行参数 参数 描述 -A 禁用自动重新生成哈希表 -b 禁用 出错后的beep声 -B 不使用历史文件 -C 压缩客户端和 ...
- 鸟哥的linux私房菜——第十三章学习(Linux 帐号管理与 ACLL 权限设置)
第十三章.Linux 帐号管理与 ACLL 权限设置 1.0).使用者识别码: UID 与 GID UID :User ID GID :group ID [root@study ~]# ll -d / ...
随机推荐
- struts2 权限拦截器 拦截没有登陆的请求
假设有这样的登陆: ActionContext.getContext().getSession().put("UserMsg", userMsg); 则可以这样判断是否登陆: im ...
- 使用session技术来实现网上商城购物车的功能
首先.简单的了解session和cookie的区别: 一.session和cookie的区别: session是把用户的首写到用户独占的session中(服务器端) cookie是把用户的数据写给用户 ...
- 数据段、代码段、堆栈段、BSS段
在linux中,进程在内存中一般会分为5个段,用来存放从磁盘载入的程序代码,等. 这五个段分别是: BSS段: 通常用来存放程序中未初始化的全局变量的一块内存区域.属于静态内存分配. 问题:全局变量不 ...
- dup和dup2函数以及管道的实现
疑问:管道应该不是这样实现的,因为这要求修改程序的代码 dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符.它们经常用来重定向进程的stdin.stdout和stderr. ...
- nigix以及相关
nginx+php的配置 php与nginx整合 http://www.thinkphp.cn/topic/13082.html [入门篇]Nginx + FastCGI 程序(C/C++) 搭建高性 ...
- [译]好程序员的五声“呐喊”
通常编程情况下,会导致软件项目变坏的一些列反应 原文:The five shouts of good programmers 在任何一天,在这个世界上都有软件项目正在失败,这很常见.常见到当软件产品按 ...
- mysql rr 查询出现的事务情况
select * from INFORMATION_SCHEMA.INNODB_TRX\G The INNODB_TRX table contains information about every ...
- Java汉字排序(1)排序前要了解的知识(数组和list的排序接口)
对于包含汉字的字符串来说,排序的方式主要有两种:一种是拼音,一种是笔画. 本文就讲述如何实现按拼音排序的比较器(Comparator). 作者:Jeff 发表于:2007年12月21日 11:27 最 ...
- git 日常使用
git clone git checkout git 删除 本地分支: git branch -d <本地分支名> git branch -D <本地分支名>(大写表 ...
- C语言中的malloc和free
最近在研究php自定义函数的实现,其中php自定义函数在传递参数时,是放到人为的一个栈中,这个跟写C程序时,参数入栈的这个栈还不一样,其中延伸到了 malloc 以及free 有人说在free(p)后 ...