转 功能强大的shell:if条件语句
原文 http://blog.zol.com.cn/2322/article_2321767.html
功能强大的shell:if条件语句
if语句测试条件,测试条件返回真(0)或假(1)后,可相应执行一系列语句。if语句结构对错误检查非常有用。其格式为:
if 条件1
then 命令1
elif 条件2
then 命令2
else
命令3
fi
–b 当file存在并且是块文件时返回真
-c 当file存在并且是字符文件时返回真
-d 当pathname存在并且是一个目录时返回真
-e 当pathname指定的文件或目录存在时返回真
-f 当file存在并且是正规文件时返回真
-g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真
-h 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效
-k 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真
-p 当file存在并且是命令管道时返回为真
-r 当由pathname指定的文件或目录存在并且可读时返回为真
-s 当file存在文件大小大于0时返回真
-u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真
-w 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。
-o 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真。
UNIX Shell 里面比较字符写法:
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
-z 空串
= 两个字符相等
!= 两个字符不等
-n 非空串
更为详细的说明:
运算符 描述 示例
文件比较运算符
-e filename 如果 filename 存在,则为真 [ -e /var/log/syslog ]
-d filename 如果 filename 为目录,则为真 [ -d /tmp/mydir ]
-f filename 如果 filename 为常规文件,则为真 [ -f /usr/bin/grep ]
-L filename 如果 filename 为符号链接,则为真 [ -L /usr/bin/grep ]
-r filename 如果 filename 可读,则为真 [ -r /var/log/syslog ]
-w filename 如果 filename 可写,则为真 [ -w /var/mytmp.txt ]
-x filename 如果 filename 可执行,则为真 [ -L /usr/bin/grep ]
filename1 -nt filename2 如果 filename1 比 filename2 新,则为真 [ /tmp/install/etc/services -nt /etc/services ]
filename1 -ot filename2 如果 filename1 比 filename2 旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]
字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)
-z string 如果 string 长度为零,则为真 [ -z $myvar ]
-n string 如果 string 长度非零,则为真 [ -n $myvar ]
string1 = string2 如果 string1 与 string2 相同,则为真 [ $myvar = one two three ]
string1 != string2 如果 string1 与 string2 不同,则为真 [ $myvar != one two three ]
算术比较运算符
num1 -eq num2 等于 [ 3 -eq $mynum ]
num1 -ne num2 不等于 [ 3 -ne $mynum ]
num1 -lt num2 小于 [ 3 -lt $mynum ]
num1 -le num2 小于或等于 [ 3 -le $mynum ]
num1 -gt num2 大于 [ 3 -gt $mynum ]
num1 -ge num2 大于或等于 [ 3 -ge $mynum ]
变量: ("")双引号:用于标记多个特殊符号,但是对$,\,`,!符号例外
('')单引号:作用同上,但是可以标记""所不能的特殊符号
(``)反引号[!前的那个符号,不是单引号]一般用来执行命令
(\)反斜杠:转义符号,用于标记单个特殊符号.[root@redhat ~]# winner=bob
[root@redhat ~]# notice="the person who won is $winner"
[root@redhat ~]# echo $notice
the person who won is bob ##将$winner解析成变量
[root@redhat ~]# winner=bob
[root@redhat ~]# notice='the person who won is $winner'
[root@redhat ~]# echo $notice
the person who won is $winner ##$winner只是符号
[root@redhat ~]# echo $winner
bob
[root@redhat ~]# winner=bob
[root@redhat ~]# notice="the person who won is \$winner"
[root@redhat ~]# echo $notice
the person who won is $winner ##用\将$转义成字符
[root@redhat ~]# echo $winner
bob
[root@redhat ~]# listnew='ls *.new'
[root@redhat ~]# echo $listnew
ls main.cf.new master.cf.new ##仔细查看,两个结果不一样的
[root@redhat ~]# listnew=`ls *.new`
[root@redhat ~]# echo $listnew
main.cf.new master.cf.new
字符: 空格(space): 解析命令行参数
(*)(?)({and}):产生文件名列表
(.): 代表当前目录
($): 对变量求值
(>)(<): 重定向标准输入或输出
(&): 执行后台命令
(|): 管道输出
一般命令: echo 显示变量及字符
read 从用户处接受输入
<< 输入重定向
脚本命令相关: $0 Linux命令名
$n 命令行参数
$* 由号码1开始的所有的命令行参数
$@ 分别访问命令行参数
$# 命令参数的个数
运算: exprort 将局部变量导出为该shell中的全局变量
+,-,*,/,>,<,>=,<=,=(用于字符串的比较),==(用于数字的比较),!=,&(与),|(或),!(非).[root@redhat ~]# let a=2*7
[root@redhat ~]# echo $a
14
[root@redhat ~]# let a="2 * 7"
[root@redhat ~]# echo $a
14
test比较运算,在比较运算中,正确结果的返回值是0,而不是传统程序上的1
-gt 一个数是否大于另一个数
-lt 小于
-ge 大于等于
-le 小于等于
-eq 等于(用于数值)
-ne 不等于
-z 是否为空字符串
-n 字符串是否大于0
= 字符串是否相等
!= 是否不等
str 是否非空
-a 与
-o 或
! 非
-f 是否为普通文件
-s 文件是否为空
-r 文件是否可读
-w 文件是否可写
-x 文件是否可执行
-d 是否为目录
-h 是否为符号链接
-c 是否与字符设备相关联
-b 是否与块文件相关联[root@redhat ~]# num=5
[root@redhat ~]# test $num -eq 10
[root@redhat ~]# echo $?
1 ##返回比较的结果值
[root@redhat ~]# num=5
[root@redhat ~]# test $num -eq 5
[root@redhat ~]# echo $?
0
下面的[]符号和test的作用等同[root@redhat ~]# num=5
[root@redhat ~]# [ $num -eq 10 ] ##注意中间空格的地方
[root@redhat ~]# echo $?
1
[root@redhat ~]# num=5
[root@redhat ~]# [ $num -eq 5 ]
[root@redhat ~]# echo $?
0
给个小脚本试试[root@redhat ~]# vi lss.sh
#!/bin/bash ##使用bash
echo This is a list Bash cript:
echo S: list sizes
echo L: List all file information
echo C: list c Files
echo -n "Please enther choice:"
read choice ##等待用户输入
case $choice in
s|S) ##如果输入的是s,不区分大小写
ls -s
;;
l|L) ##如果输入的是l,不区分大小写
ls -l
;;
c|C) ##如果输入的是c,不区分大小写
ls *.new
;;
*) ##都不是的话
echo error
esac
[root@redhat ~]# chmod +x lss.sh
[root@redhat ~]# ./lss.sh
This is a list Bash cript:
S: list sizes
L: List all file information
C: list c Files
Please enther choice:l
total 69
-rw-r--r-- 1 root root 1251 Oct 24 15:01 anaconda-ks.cfg
drwx------ 3 root root 1024 Oct 24 15:04 Desktop
-rw-r--r-- 1 root root 545 Jan 19 15:22 genhtml.sh
-rw-r--r-- 1 root root 47583 Oct 24 15:01 install.log
-rw-r--r-- 1 root root 4702 Oct 24 15:01 install.log.syslog
-rwxr-xr-x 1 root root 248 Jan 19 15:56 lss.sh
-rw-r--r-- 1 root root 2737 Jan 6 12:45 main.cf.new
-rw-r--r-- 1 root root 3125 Jan 6 12:45 master.cf.new
-rwxr-xr-x 1 root root 263 Dec 5 17:39 userandgroupadd.sh
转 功能强大的shell:if条件语句的更多相关文章
- Shell 编程 条件语句
本篇主要写一些shell脚本条件语句的使用. 条件测试 test 条件表达式 [ 条件表达式 ] 文件测试 -d:测试是否为目录(Directory). -e:测试文件或目录是否存在(Exist). ...
- SHELL 中条件语句的运用 if for 条件测试语句
if条件测试语句可以让脚本根据实际情况自动执行相应的命令.从技术角度来讲,if语句分为单分支结构.双分支结构.多分支结构:其复杂度随着灵活度一起逐级上升. if条件语句的单分支结构由if.then.f ...
- Linux就该这么学--Shell脚本条件语句(二)
1.for条件语句 先读取多个不同的变量值,然后逐一执行同一组命令. 从列表文件中读取主机地址,逐个测试是否在线. 从ipadds.txt中读取主机地址后赋值给HLIST变量后逐个ping列表中的主机 ...
- Linux就该这么学--Shell脚本条件语句(一)
1.条件测试语句能够让Shell脚本根据实际工作灵活调整工作内容,例如判断系统的状态后执行指定的工作,或创建指定数量的用户,批量修改用户密码,这些都可以让Shell脚本通过条件测试语句完成. if条件 ...
- Shell if条件语句
1.if条件语句:设定一个条件如果怎么,然后怎么样. (1)-gt大于.-lt小于.-ge大于等于.-le小于等于.-eq等于.-ne不等于. (2)[]内是包括变量时所使用的. (3)-f文件.-n ...
- Shell cace条件语句
cace条件语句,取相对应的多个值,进行输出. 语句:case语句:case $n in 回车\ 值)回车\ 命令 :: 值)命令 esac case $1 in start) echo “启动” ...
- Shell Scripts - 条件语句,case语句,function功能
修改之前的代码 1.判断 $1 是否为 hello,如果是的话,就显示 "Hello, how are you ?": 2.如果没有加任何参数,就提示使用者必须要使用的参数 ...
- shell if 条件语句实践
对于if 语法 我们不过多做介绍,这里直接上实例,以开发rsync服务启动脚本为例,先对rsync做个简单介绍 [root@backup ~]# rpm -qa|grep rsync rsync--. ...
- shell 学习笔记8-case条件语句
一.case语句简介 1.什么是case条件语句 case条件语句就相当于多分支的if/elif/else条件语句,但是比这样的语句更规范更好看,经常被用在失效系统服务启动脚本等企业应用中 程序将ca ...
随机推荐
- Gym - 101498G(Super Subarray )
In this problem, subarray is defined as non-empty sequence of consecutive elements. We define a suba ...
- memcached整理の缓存问题
声明:博客来源http://www.cnblogs.com/AloneSword/p/3931905.html,谢谢他的分享! 缓存穿透与缓存雪崩 缓存系统不得不考虑的另一个问题是缓存穿透与失效时的雪 ...
- Maven整理笔记のMaven使用
POM 就像Make的Makefile,Ant的build.xml一样,Maven项目的核心是pom.xml.POM(Project Object Model项目对象模型),定义了项目的基本信息,用于 ...
- 百万数据测试 Entity Framework 到底有多慢
测试环境 硬件:阿里云乞丐配置 操作系统:Centos 7 CPU: 1核 内存:1 GB (I/O优化) 网络:1Mbps(峰值) 软件 .net core 2.0 ZKEACMS For .net ...
- 工作中的Buff加成-结构化思考力:自创独门武功 3-3-3原则
3-3-3原则 3秒钟 *思考三秒钟 沟通前根据交谈内容思考3秒钟,思考下具体需要表达什么,思考的主要点为What.Why.How. *冷静三秒钟 在沟通过程中,若遇到气氛不和谐,比如生气.愤恨等时, ...
- 二十四、MongoDB数据库的使用
首先按照上一篇文章的介绍,启动并连接数据库 然后我们开始学习如何使用MongoDB数据库: 1.创建数据库 第一步,在cmd窗口执行: use dbname dbname是你打算要创建的数据库名称 执 ...
- 201621123012 《Java程序设计》第14次学习总结
作业14-数据库 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截 ...
- 17、xtrabackup 常用备份功能与选项
并行备份 > innobackupex -p123123 --parallel=8 /backup 节流备份 > innobackupex -p123123 --throttle=200 ...
- 多继承c3算法
一.mro mro即 method resolution order (方法解释顺序),主要用于在多继承时判断属性的路径(来自于哪个类). print(类.mro)得到属性路径按继承顺序 在pytho ...
- 一分钟了解 TCP/IP 模型
原文讲的不是特别细,为了便于理解,我颠倒了顺序. 写在开始 我们需要知道协议到底是什么. 在网络上,一个协议对应于管理系统之间如何相互通信的规则. 然后我们需要知道什么是协议族. 一个协议族是一系列协 ...