Shell脚本编程之(五)条件判断式
利用 if … then
单层、简单条件判断式
if [ 条件判断式 ]; then
当条件判断式成立时,可以进行的指令工作内容;
fi <==将 if 反过来写,就成为 fi 啦!结束 if 之意!
注意:[]的使用注意事项
可以有多个中括号来隔开喔!而括号与括号之间,则以 && 或 || 来隔开,他们的意义是:
- && 代表 AND
- || 代表 or
[root@node01 bin]$ vim ans_yn- - 2.sh
#!/bin/bash
# Program:
# This program shows the user's choice
# History:
# 2018/12/23 Rivers First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Please input (Y/N): " yn
if [ "${yn}" == "Y" ] || [ "${yn}" == "y" ]; then
echo "OK, continue"
exit 0
fi
if [ "${yn}" == "N" ] || [ "${yn}" == "n" ]; then
echo "Oh, interrupt!"
exit 0
fi
echo "I don't know what your choice is" && exit 0
多重、复杂条件判断式
# 一个条件判断,分成功进行与失败进行 (else)
if [ 条件判断式 ]; then
当条件判断式成立时,可以进行的指令工作内容;
else
当条件判断式不成立时,可以进行的指令工作内容;
fi
如果考虑更复杂的情况,则可以使用这个语法:
# 多个条件判断 (if ... elif ... elif ... else) 分多种不同情况执行
if [ 条件判断式一 ]; then
当条件判断式一成立时,可以进行的指令工作内容;
elif [ 条件判断式二 ]; then
当条件判断式二成立时,可以进行的指令工作内容;
else
当条件判断式一与二均不成立时,可以进行的指令工作内容;
fi
你得要注意的是, elif 也是个判断式,因此出现 elif 后面都要接 then 来处理!但是 else 已经是最后的没有成立的结果了, 所以 else 后面并没有 then 喔!
一般来说,如果你不希望用户由键盘输入额外的数据时, 可以使用之前提到的参数功能 ($1)!让用户在下达指令时就将参数带进去! 现在我们想让用户输入『 hello 』这个关键词时,利用参数的方法可以这样依序设计:
1.判断 $1 是否为 hello,如果是的话,就显示 “Hello, how are you ?”;
2. 如果没有加任何参数,就提示使用者必须要使用的参数下达法;
3. 而如果加入的参数不是 hello ,就提醒使用者仅能使用 hello 为参数。
[root@node01 bin]$ vim hello-2.sh
#!/bin/bash
# Program:
# Check $1 is equal to "hello"
# History:
# 2018/12/23 Rivers First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
if [ "${1}" == "hello" ]; then
echo "Hello, how are you ?"
elif [ "${1}" == "" ]; then
echo "You MUST input parameters, ex> {${0} someword}"
else
echo "The only parameter is 'hello', ex> {${0} hello}"
fi
利用 case … esac 判断
上面提到的『 if … then … fi 』对于变量的判断是以『比对』的方式来分辨的, 如果符合状态就进行某些行为,并且透过较多层次 (就是 elif …) 的方式来进行多个变量的程序代码撰写,譬如 hello-2.sh 那个小程序,就是用这样的方式来撰写的啰。 好,那么万一我有多个既定的变量内容,例如 hello-2.sh 当中,我所需要的变量就是 “hello” 及空字符串两个, 那么我只要针对这两个变量来设定状况就好了,对吧?那么可以使用什么方式来设计呢?呵呵~就用 case … in … esac 吧~,他的语法如下:
case $变量名称 in <==关键词为 case ,还有变数前有钱字号
"第一个变量内容") ) <==每个变量内容建议用双引号括起来,关键词则为小括号 )
程序段
;; <==每个类别结尾使用两个连续的分号来处理!
"第二个变量内容") )
程序段
;;
*) ) <==最后一个变量内容都会用 * 来代表所有其他值
不包含第一个变量内容与第二个变量内容的其他程序执行段
exit 1
;;
esac <==最终的 case 结尾!『反过来写』思考一下!
要注意的是,这个语法以 case (实际案例之意) 为开头,结尾自然就是将 case 的英文反过来写!就成为 esac 啰! 不会很难背啦!另外,每一个变量内容的程序段最后都需要两个分号 来代表该程序段落的结束,这挺重要的喔! 至于为何需要有 * 这个变量内容在最后呢?这是因为,如果用户不是输入变量内容一或二时, 我们可以告知用户相关的信息啊!废话少说,我们拿 hello-2.sh的案例来修改一下,他应该会变成这样喔:
[root@node01 bin]$ vim hello-3.sh
#!/bin/bash
# Program:
# Show "Hello" from $1.... by using case .... esac
# History:
# 2018/12/23 Rivers First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
case ${1} in
"hello")
echo "Hello, how are you ?"
;;
"")
echo "You MUST input parameters, ex> {${0} someword}"
;;
*) # 其实就相当于通配符,0~无穷多个任意字符之意!
echo "Usage ${0} {hello}"
;;
esac
一般来说,使用『 case $变量 in 』这个语法中,当中的那个『 $变量 』大致有两种取得的方式:
- 直接下达式:例如上面提到的,利用『 script variable 』 的方式来直接给予 $1 这个变量的内容,这也是在 /etc/init.d 目录下大多数程序的设计方式。
- 交互式:透过 read 这个指令来让用户输入变量的内容。
[root@node01 bin]$ vim show123.sh
#!/bin/bash
# Program:
# This script only accepts the flowing parameter: one, two or three.
# History:
# 2018/12/23 Rivers First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo "This program will print your selection !"
# read -p "Input your choice: " choice # 暂时取消,可以替换!
# case ${choice} in # 暂时取消,可以替换!
case ${1} in # 现在使用,可以用上面两行替换!
"one")
echo "Your choice is ONE"
;;
"two")
echo "Your choice is TWO"
;;
"three")
echo "Your choice is THREE"
;;
*)
echo "Usage ${0} {one|two|three}"
;;
esac
利用 function
什么是『函数 (function)』功能啊?简单的说,其实, 函数可以在 shell script 当中做出一个类似自定义执行指令的东西,最大的功能是, 可以简化我们很多的程序代码~举例来说,上面的 show123.sh当中,每个输入结果 one, two, three 其实输出的内容都一样啊~那么我就可以使用 function 来简化了! function 的语法是这样的:
function fname () {
程序段
}
那个 fname 就是我们的自定义的执行指令名称~而程序段就是我们要他执行的内容了。 要注意的是,因为 shell script 的执行方式是由上而下,由左而右, 因此在 shell script 当中的 function 的设定一定要在程序的最前面, 这样才能够在执行时被找到可用的程序段喔 (这一点与传统程序语言差异相
当大!初次接触的朋友要小心!)! 好~我们将 show123.sh改写一下,自定义一个名为 printit 的函数来使用喔:
#!/bin/bash
# Program:
# Use function to repeat information.
# History:
# 2018/12/23 Rivers First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
function printit(){
echo -n "Your choice is " # 加上 -n 可以不断行继续在同一行显示
}
echo "This program will print your selection !"
case ${1} in
"one")
printit; echo ${1} | tr 'a-z' 'A-Z' # 将参数做大小写转换!
;;
"two")
printit; echo ${1} | tr 'a-z' 'A-Z'
;;
"three")
printit; echo ${1} | tr 'a-z' 'A-Z'
;;
*)
echo "Usage ${0} {one|two|three}"
;;
esac
另外, function 也是拥有内建变量的~他的内建变量与 shell script 很类似, 函数名称代表示 $0 ,而后续接的变量也是以 $1, $2… 来取代的~ 这里很容易搞错喔~因为『 function fname() { 程序段 } 』内的 $0, $1… 等等与 shell script 的 $0 是不同的。以上面 show123-2.sh来说,假如我下达:『 sh show123-2 one 』 这表示在 shell script 内的 $1 为 “one” 这个字符串。但是在 printit() 内的 $1 则与这个 one 无关。 我们将上面的例子再次的改写一下,让你更清楚!
[root@node01 bin]$ vim show123-3.sh
#!/bin/bash
# Program:
# Use function to repeat information.
# History:
# 2018/12/23 Rivers First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
function printit(){
echo "Your choice is ${1}" # 这个 $1 必须要参考底下指令的下达
}
echo "This program will print your selection !"
case ${1} in
"one")
printit 1 # 请注意, printit 指令后面还有接参数!
;;
"two")
printit 2
;;
"three")
printit 3
;;
*)
echo "Usage ${0} {one|two|three}"
;;
esac
Shell脚本编程之(五)条件判断式相关推荐
- 第五课-第三讲05_03_bash脚本编程之二 条件判断
第五课-第三讲05_03_bash脚本编程之二 条件判断 变量名称:只能保含字母数字下划线,且不能数字开头.不能和系统中已存在的环境变量重名.见名知意 bash中如何实现条件判断? 条件测试类型: 整 ...
- 1.3 Shell脚本编程基础之条件测试
判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成测试过程 评估布尔声明,以便用在条件性执行中 • 若真,则返回0 • 若假,则返回1 测试命令: • test EXPR ...
- 【Linux命令行与Shell脚本编程】第五章 理解 Shell 父子关系 后台进程 协程
Linux命令行与Shell脚本编程 第五章 理解 Shell 文章目录 Linux命令行与Shell脚本编程 五,理解 Shell 5.1,shell的类型 5.2,shell的父子关系 5.2.1 ...
- Shell脚本编程之(四)善用判断式
前言 在了解判断式之前,先简单的了解几个数据流重定向(今后会详细整理这一块的知识)的命令执行判断依据 : cmd ; cmd ( 不考虑指令相关性的连续指令下达) 在指令与指令中间利用分号 (;)来隔 ...
- 嵌入式 Linux 入门(五、Shell 脚本编程上:认识 Shell 脚本)
大家好,是矜辰所致,嵌入式 Linux入 门第五课,本课开始简单学习一下 Shell 脚本编程. 目录 前言 一.Shell 脚本基础说明 1.1 什么是 Shell 脚本 1.2 Shell 脚本的 ...
- if...elif...else...fi和case...esac的脚本条件判断式
注意1: if 表达式和case 表达式的区别及什么时候使用哪个要有明确的区分? 『 if .... then .... fi 』对于变量的判断是以『比对』的方式来分辨的, 如果符合状态就进行某些行为 ...
- shell 脚本编程 五:函数
一.函数定义 有两种格式可以用来在 bash shell 脚本中创建函数. 第一种格式采用关键字 function,后跟分配给该代码块的函数名. function name { commands } ...
- php shell脚本怎么写,Shell脚本编程入门
一.什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do tou ...
- Shell 脚本编程 基本语法:
Shell 脚本编程语法: 注: 文章来源 http://www.cnblogs.com/yunquan/p/6821850.html 视频来源:https://www.bilibili.com/vi ...
最新文章
- UIPopoverController在ARC环境下用法注意
- Thread系列之Thread.Join()
- Android开源底部导航,一个开源JPTabBar for Android,炫酷的底部导航栏
- ActiveMQ 消息持久化到Mysql数据库
- SFB2015 多SIP域
- ghelper怎么在手机上用_当长时间不用手机玩《崩坏3》、《战双》
- [css] 为什么说css的选择器是从右向左匹配?
- sqlserver连接字符串_10分钟使用EF Core连接MSSQL数据库
- python 描述_python描述符
- 山峰和山谷(信息学奥赛一本通-T1454)
- Nginx源码分析 - HTTP模块篇 - HTTP模块的阶段处理PHASE handler(23)
- PR开场片头视频模板 多帧城市闪点社交媒体短视频pr模板
- HMM原理解析(转载)
- python storm连接mysql_Python ORM Storm 源码修改
- iOS开发- 以图搜图功能实现 (源码+解析)
- 前端实现三角形的四种方法
- 语法分析--自上而下分析的基本问题
- 毕业一年,工作一年,有收获,有失去,有遗憾,但仍一往无前 (征文)
- 台式电脑计算机硬盘清理,小编教您台式电脑如何清理灰尘
- Multisim电路仿真-验证KCL和KVL
热门文章
- 软件测试 : 第5次作业 -- 基于Jmeter的 性能测试
- jQuery中$.get()、$.post()和$.ajax()
- load和loads的区别
- 怎样把Linux的私钥文件id_rsa转换成putty的ppk格式
- input里面check 状态检测
- Linux命令总结:file
- C++中的struct与class继承方式
- vsftpd服务详解
- Android Studio 智能感知无效
- DataGridView用法总结