第十三章、学习 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 / ...
随机推荐
- [itint5]直角路线遍历棋盘
http://www.itint5.com/oj/#22 这题一开始直接用暴力的DFS来做,果然到25的规模就挂了. vector<bool> visited(50, false); ve ...
- HDU1875——畅通工程再续(最小生成树:Kruskal算法)
畅通工程再续 Description相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当 ...
- Android studio中不同颜色代表什么意思
和你的版本控制工具相关 绿色,已经加入控制暂未提交红色,未加入版本控制蓝色,加入,已提交,有改动白色,加入,已提交,无改动
- 【HDOJ】4347 The Closest M Points
居然是KD解. /* 4347 */ #include <iostream> #include <sstream> #include <string> #inclu ...
- Android开发之json解析
目前正在尝试着写app,发现看懂代码和能写出来差距很大,最关键的是java基础比较的差,因为只会python,java基础只学习了一个礼拜就过了.感觉java写出来的代码不如python简单明了. 上 ...
- poj1925Spiderman(dp)
链接 确实是破题 按复杂度估计怎么着也不能按坐标D 啊 网上的代码交上去还TLE 无语了 多次TLE之后终于看到一次WA..好高兴 以横坐标进行DP dp[j] = min(dp[j],dp[2*x ...
- @深入注解,在Java中设计和使用自己的注解
我们用过 JDK给我们提供的 @Override @Deprecated @SuppressWarning 注解 ,这些注解是JDK给我们提供的 ,我们只是在用别人写好的东西 ,那么我们是否可以 ...
- DataTable导出到Excel(.NET 4.0)
最近在论坛里又看到很多关于DataTable(DataSet)导入Excel的帖子,我也温故知新一下,用VS2010重新整理了一个Sample.这个问题简化一下就是内存数据到文件,也就是遍历赋值,只不 ...
- UVa 101 (模拟) The Blocks Problem
题意: 有n个木块及n个木块堆,初始状态是第i个木块在第i个木块堆上.对应有四种操作,然后输出最终状态. 分析: 用一个vector<int>模拟一个木块堆,进行相应操作即可. #incl ...
- 使用Amoeba 实现MySQL DB 读写分离
Amoeba(变形虫)项目是一个开源框架,于2008年开始发布一款 Amoeba for Mysql软件: 这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQ ...