前言

在了解判断式之前,先简单的了解几个数据流重定向(今后会详细整理这一块的知识)的命令执行判断依据

cmd ; cmd ( 不考虑指令相关性的连续指令下达)

在指令与指令中间利用分号 (;)来隔开,这样一来,分号前的指令执行完后就会立刻接着执行后面的指令了

  • &&

cmd1 && cmd2

1. 若 cmd1 执行完毕且正确执行($?=0),则开始执行 cmd2

2. 若 cmd1 执行完毕且为错误 ($?≠0),则 cmd2 不执行

  • ||

cmd1 || cmd2

1. 若 cmd1 执行完毕且正确执行($?=0),则 cmd2 不执行

2. 若 cmd1 执行完毕且为错误 ($?≠0),则开始执行 cmd2

利用 test 指令的测试功能

test主要作用:
check file types and compare values
检查文件类型并比较值

  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 侦测该档名是否存在且为『非空白文件』?
  1. 两个文件之间的比较,如: test file1 -nt file2
    -nt (newer than)判断 file1 是否比 file2 新
    -ot (older than)判断 file1 是否比 file2 旧
    -ef
    判断 file1 与 file2 是否为同一文件,可用在判断 hard link 的判定上。 主要意义在判
    定,两个文件是否均指向同一个 inode 哩!
  2. 关于两个整数之间的判定,例如 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)
  3. 判定字符串的数据
    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
  4. 多重条件判定,例如: 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

煮个栗子

#!/bin/bash
# Program:
#  User input a filename, program will check the flowing:
#  1.) exist? 2.) file/directory? 3.) file permissions
# History:
# 2018/12/23  Rivers  First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH# 1. 让使用者输入档名,并且判断使用者是否真的有输入字符串?
echo -e "Please input a filename, I will check the filename's type and permission. \n\n"
read -p "Input a filename : " filename
test -z ${filename} && echo "You MUST input a filename." && exit 0
# 2. 判断文件是否存在?若不存在则显示讯息并结束脚本
test ! -e ${filename} && echo "The filename '${filename}' DO NOT exist" && exit 0
# 3. 开始判断文件类型与属性
test -f ${filename} && filetype="regulare file"
test -d ${filename} && filetype="directory"
test -r ${filename} && perm="readable"
test -w ${filename} && perm="${perm} writable"
test -x ${filename} && perm="${perm} executable"
# 4. 开始输出信息!
echo "The filename: ${filename} is a ${filetype}"
echo "And the permissions for you are : ${perm}"

利用判断符号 []

中括号的使用方法与 test 几乎一模一样啊~ 只是中括号比较常用在条件
判断式 if … then … fi 的情况中就是了

注意事项

  • 在中括号 [] 内的每个组件都需要有空格键来分隔
  • 在中括号内的变数,最好都以双引号括号起来
  • 在中括号内的常数,最好都以单或双引号括号起来

煮个栗子

[root@node01 bin]$  vim ans_yn.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
[ "${yn}" == "Y" -o "${yn}" == "y" ] && echo "OK, continue" && exit 0
[ "${yn}" == "N" -o "${yn}" == "n" ] && echo "Oh, interrupt!" && exit 0
echo "I don't know what your choice is" && exit 0

Shell script 的默认变数($0, $1…)

我们知道指令可以带有选项与参数,例如 ls -la 可以察看包含隐藏文件的所有属性与权限。那么 shell script 能不能在脚本档名后面带有参数呢?很有趣喔!举例来说,如果你想要重新启动系统的网络,可以这样做:

[root@node01 ~]$  file /etc/init.d/network
/etc/init.d/network: Bourne-Again shell script, ASCII text executable
# 使用 file 来查询后,系统告知这个文件是个 bash 的可执行 script 喔!

如果你要依据程序的执行给予一些变量去进行不同的任务时,本章一开始是使用 read 的功能!但 read 功能的问题是你得要手动由键盘输入一些判断式。如果透过指令后面接参数, 那么一个指令就能够处理完毕而不需要手动再次输入一些变量行为!这样下达指令会比较简单方便啦!script 是怎么达成这个功能的呢?其实 script 针对参数已经有设定好一些变量名称了!对应如下:

/path/to/scriptname opt1 opt2 opt3 opt4$0          $1   $2   $3   $4

这样够清楚了吧?执行的脚本档名为 $0 这个变量,第一个接的参数就是 $1 啊~ 所以,只要我们在 script 里面善用 $1 的话,就可以很简单的立即下达某些指令功能了!除了这些数字的变量之外,我们还有一些较为特殊的变量可以在 script 内使用来呼叫这些参数喔!

那个 $@ 与 $* 基本上还是有所不同啦!不过,一般使用情况下可以直接记忆 $@ 即可! 好了,来做个例子吧~假设我要执行一个可以携带参数的 script ,执行该脚本后屏幕会显示如下的数据:

  • 程序的文件名为何?
  • 共有几个参数?
  • 若参数的个数小于 2 则告知使用者参数数量太少
  • 全部的参数内容为何?
  • 第一个参数为何?
  • 第二个参数为何
[root@node01 bin]$  vim how_paras.sh
#!/bin/bash
# Program:
#  Program shows the script name, parameters...
# History:
# 2018/12/23  Rivers  First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo "The script name is ==> ${0}"
echo "Total parameter number is ==> $#"
[ "$#" -lt 2 ] && echo "The number of parameter is less than 2. Stop here." && exit 0
echo "Your whole parameter is ==> '$@'"
echo "The 1st parameter ==> ${1}"
echo "The 2nd parameter ==> ${2}"

执行结果

[root@node01 bin]$  sh how_paras.sh theone haha quot
The script name is ==> how_paras.sh <==檔名
Total parameter number is ==> 3 <==果然有三个参数
Your whole parameter is ==> 'theone haha quot' <==参数的内容全部
The 1st parameter ==> theone <==第一个参数
The 2nd parameter ==> haha <==第二个参数

shift :造成参数变量号码偏移

除此之外,脚本后面所接的变量是否能够进行偏移 (shift) 呢?什么是偏移啊?我们直接以底下的范例来说明好了, 用范例说明比较好解释!我们将 how_paras.sh 的内容稍作变化一下,用来显示每次偏移后参数的变化情况:

[root@node01 bin]$  vim shift_paras.sh
#!/bin/bash
# Program:
#  Program shows the effect of shift function.
# History:
# 2018/12/23  Rivers  First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo "Total parameter number is ==> $#"
echo "Your whole parameter is ==> '$@'"
shift # 进行第一次『一个变量的 shift 』
echo "Total parameter number is ==> $#"
echo "Your whole parameter is ==> '$@'"
shift 3 # 进行第二次『三个变量的 shift 』
echo "Total parameter number is ==> $#"
echo "Your whole parameter is ==> '$@'"

执行结果

[root@node01 bin]$  sh shift_paras.sh one two three four five six <==给予六个参数
Total parameter number is ==> 6 <==最原始的参数变量情况
Your whole parameter is ==> 'one two three four five six'
Total parameter number is ==> 5 <==第一次偏移,看底下发现第一个 one 不见了
Your whole parameter is ==> 'two three four five six'
Total parameter number is ==> 2 <==第二次偏移掉三个,two three four 不见了
Your whole parameter is ==> 'five six'

光看结果你就可以知道啦,那个 shift 会移动变量,而且 shift 后面可以接数字,代表拿掉最前面的几个参数的意思。 上面的执行结果中,第一次进行 shift 后他的显示情况是『 one two three four five six』,所以就剩下五个啦!第二次直接拿掉三个,就变成『 two three four five six 』

Shell脚本编程之(四)善用判断式相关推荐

  1. linux之基础shell脚本编程1 基础变量赋值

    本章主要介绍函数的基础,变量赋值,逻辑运算,条件表达式,测试 linux之基础shell脚本编程1  基础变量赋值 linux之基础shell脚本编程2 if语句循环判断 linux之基础shell脚 ...

  2. 【2018深信服 醒狮计划】《Linux命令行与Shell脚本编程大全》学习笔记

    2018深信服"醒狮计划"笔记 第3周(5.02-5.13) 课程 必修 选修 基本要求 Shell编程 <Linux命令行与Shell脚本编程大全> <Perl ...

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

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

  4. Linux命令行与shell脚本编程大全:第2版

    <Linux命令行与shell脚本编程大全:第2版> 基本信息 作者: (美)布卢姆(Blum,R.) 布雷斯纳汉(Bresnahan.C.) [作译者介绍] 译者: 武海峰 丛书名: 图 ...

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

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

  6. Linux shell脚本编程(二)

    Linux shell脚本编程(二) -------------------------------------------------------------------- 注:如果你对python ...

  7. 《Linux命令行与Shell脚本编程大全第2版.布卢姆》pdf

    下载地址:网盘下载 内容简介  · · · · · · 本书是一本关于Linux 命令行与shell 脚本编程的全面教程.全书分为四部分:第一部分介绍Linuxshell 命令行:第二部分介绍shel ...

  8. 《Linux命令行与shell脚本编程大全》(第三版)读书笔记

    第一部分 Linux命令行 第三章.基本的bash shell命令 bash手册 man 命令 例子: man cat 空格翻页.回车下一行.左右键看右侧(左侧)内容.q退出 info info in ...

  9. shell脚本编程学习笔记8(XDL)——流程控制和循环

    shell脚本编程学习笔记8--流程控制和循环 1,if语句 1,框架 1,单分支:if [条件判断式] ;thenprogramfiif [条件判断式]thenprogramfi注意:if语句使用f ...

  10. 【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-汇总 ( Chapter1-Chapter16 )

    一.初识 Linux shell Linux 系统可划分为以下 4 部分. Linux 内核 GNU 工具 图形化桌面环境 应用软件 内核主要负责以下 4 种功能. 系统内存管理 内核通过硬盘上称为交 ...

最新文章

  1. vivado----fpga硬件调试 (三)----mark_debug
  2. 知识回顾——构造函数
  3. pyecharts应用1 词云
  4. Qt Creator加States
  5. zsh of kali
  6. JEECG领取免费开发文档活动
  7. Linus Torvalds 警告:勿用 Linux 5.12 rc1,担心供应链攻击?
  8. SQL Server2000 在 win2003上安装不上,我的解决办法
  9. 软件nginx 0.8.16
  10. 游戏编程之二 windows编程基础
  11. 2021-09-18
  12. 远大驾校 考驾照 报名 科目一 科目二 科目三 科目四 视频
  13. c语言编译defined,#if defined(__GNUC__)的意思是不是如果使用的是GCC编译器?
  14. ArcMap通过空间连接和数据汇总实现批量统计
  15. 打开Windows系统某设置的方法有哪些?
  16. 2021年京东撸货还能做吗?轻松实现利益最大化,新手必看!
  17. 云客Drupal源码分析之数组操作
  18. 【办公自动化】Python图像操作术
  19. 右键计算机管理显示找不到文件,win10右键管理找不到文件怎么办 右键管理找不到文件解决方法...
  20. 2022 GopherChina 出品人及演讲内容揭晓(二)

热门文章

  1. loj10135. 「一本通 4.4 练习 2」祖孙询问
  2. python 入门拾遗
  3. 使用ansible远程管理集群
  4. Clipboard.js – 现代方式实现复制文本到剪贴板
  5. 如何在套接字IO操作上设置超时机制
  6. 应届生还是研究生?与大学生的MSN谈话二
  7. JAVA学习day06
  8. IDEA手动安装Scala插件[zt]
  9. Windows Server 2012 R2通过IIS实现AD帐号密码修改功能
  10. d3js path generator vs layouts