利用 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脚本编程之(五)条件判断式相关推荐

  1. 第五课-第三讲05_03_bash脚本编程之二 条件判断

    第五课-第三讲05_03_bash脚本编程之二 条件判断 变量名称:只能保含字母数字下划线,且不能数字开头.不能和系统中已存在的环境变量重名.见名知意 bash中如何实现条件判断? 条件测试类型: 整 ...

  2. 1.3 Shell脚本编程基础之条件测试

    判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成测试过程 评估布尔声明,以便用在条件性执行中 • 若真,则返回0 • 若假,则返回1 测试命令: • test EXPR ...

  3. 【Linux命令行与Shell脚本编程】第五章 理解 Shell 父子关系 后台进程 协程

    Linux命令行与Shell脚本编程 第五章 理解 Shell 文章目录 Linux命令行与Shell脚本编程 五,理解 Shell 5.1,shell的类型 5.2,shell的父子关系 5.2.1 ...

  4. Shell脚本编程之(四)善用判断式

    前言 在了解判断式之前,先简单的了解几个数据流重定向(今后会详细整理这一块的知识)的命令执行判断依据 : cmd ; cmd ( 不考虑指令相关性的连续指令下达) 在指令与指令中间利用分号 (;)来隔 ...

  5. 嵌入式 Linux 入门(五、Shell 脚本编程上:认识 Shell 脚本)

    大家好,是矜辰所致,嵌入式 Linux入 门第五课,本课开始简单学习一下 Shell 脚本编程. 目录 前言 一.Shell 脚本基础说明 1.1 什么是 Shell 脚本 1.2 Shell 脚本的 ...

  6. if...elif...else...fi和case...esac的脚本条件判断式

    注意1: if 表达式和case 表达式的区别及什么时候使用哪个要有明确的区分? 『 if .... then .... fi 』对于变量的判断是以『比对』的方式来分辨的, 如果符合状态就进行某些行为 ...

  7. shell 脚本编程 五:函数

    一.函数定义 有两种格式可以用来在 bash shell 脚本中创建函数. 第一种格式采用关键字 function,后跟分配给该代码块的函数名. function name { commands } ...

  8. php shell脚本怎么写,Shell脚本编程入门

    一.什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do tou ...

  9. Shell 脚本编程 基本语法:

    Shell 脚本编程语法: 注: 文章来源 http://www.cnblogs.com/yunquan/p/6821850.html 视频来源:https://www.bilibili.com/vi ...

最新文章

  1. UIPopoverController在ARC环境下用法注意
  2. Thread系列之Thread.Join()
  3. Android开源底部导航,一个开源JPTabBar for Android,炫酷的底部导航栏
  4. ActiveMQ 消息持久化到Mysql数据库
  5. SFB2015 多SIP域
  6. ghelper怎么在手机上用_当长时间不用手机玩《崩坏3》、《战双》
  7. [css] 为什么说css的选择器是从右向左匹配?
  8. sqlserver连接字符串_10分钟使用EF Core连接MSSQL数据库
  9. python 描述_python描述符
  10. 山峰和山谷(信息学奥赛一本通-T1454)
  11. Nginx源码分析 - HTTP模块篇 - HTTP模块的阶段处理PHASE handler(23)
  12. PR开场片头视频模板 多帧城市闪点社交媒体短视频pr模板
  13. HMM原理解析(转载)
  14. python storm连接mysql_Python ORM Storm 源码修改
  15. iOS开发- 以图搜图功能实现 (源码+解析)
  16. 前端实现三角形的四种方法
  17. 语法分析--自上而下分析的基本问题
  18. 毕业一年,工作一年,有收获,有失去,有遗憾,但仍一往无前 (征文)
  19. 台式电脑计算机硬盘清理,小编教您台式电脑如何清理灰尘
  20. Multisim电路仿真-验证KCL和KVL

热门文章

  1. 软件测试 : 第5次作业 -- 基于Jmeter的 性能测试
  2. jQuery中$.get()、$.post()和$.ajax()
  3. load和loads的区别
  4. 怎样把Linux的私钥文件id_rsa转换成putty的ppk格式
  5. input里面check 状态检测
  6. Linux命令总结:file
  7. C++中的struct与class继承方式
  8. vsftpd服务详解
  9. Android Studio 智能感知无效
  10. DataGridView用法总结