Linux Shell脚本编程-基础2
命令退出状态码
bash每个命令,执行状态都有返回值
0表示成功
非0表示失败(1-255)
$?特殊变量可以打印出上一条命令的状态返回值
脚本的状态返回值是脚本执行的最后一条命令
自定义脚本状态返回值:exit #
#为0-255的数字(0、1、127、255这几个数字保留系统自身用)
引用命令的执行回显结果:
`command`或$(command)
引用命令执行成功与否的状态结果:
一定是直接执行命令。通常需要将执行回显结果重定向至/dev/null
注意:
脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
条件测试
作用:
判断某需求是否满足,需要由测试机制来实现
专用的测试表达式需要由测试命令辅助完成测试过程
执行命令,利用命令状态返回值来判断
0:成功
1-255:失败
测试表达式方法:
test 测试表达式 test命令方式的表达式
[ 测试表达式 ] 注意中括号和表达式前后有空格
[[ 测试表达式 ]] 做字符串比较时用这种方式,因为有时候采用单中括号会产生错误(支持模式匹配)
条件性的执行逻辑操作符,根据退出的状态而定,命令有条件的运行
&& :代表条件性的AND
|| :代表条件性的OR
[root@centos7 ~]# test 2 -ne 3
[root@centos7 ~]# echo $?
0
[root@centos7 ~]# test 2 -gt 3
[root@centos7 ~]# echo $?
1
[root@centos7 ~]# test 2 -lt 3
[root@centos7 ~]# echo $?
0
字符串测试
双目测试:判断两个字符串
> 大于(按ASSIC码先后顺序比较)
< 小于
== 等于,判断两个字符串是否相等
!=或<> 不等于,判断两个字符串是否不相等
=~ 左侧是字符串,右侧是一个匹配模式,判断左侧的字符串能否被右侧的模式所匹配:通常只在[[ ]]中使用模式中可以使用行首、行尾锚定符,但是模式不要加引号(扩展表达式)
单目测试:判断字符串(变量)是否为空,字符串一定要加双引号
-n "$stringVar":判断字符串是否不空,不空为真,空则为假
-z "$stringVar":判断判断字符串是否为空,空则为真,不空则假
演示:
[root@centos7 ~]# [ tom == Tom ]
[root@centos7 ~]# echo $?
1
[root@centos7 ~]# [ tom == tom ]
[root@centos7 ~]# echo $?
0
# 变量替换要尽量用双引号,如果不用的话,如果变量不存在为空,会报错
[root@centos7 ~]# [ tom == $name ]
-bash: [: tom: 期待一元表达式
[root@centos7 ~]# [ tom == "$name" ]
[root@centos7 ~]# echo $?
1
[root@centos7 bin]# [[ tom == $name ]]
[root@centos7 bin]# echo $?
1
[root@centos7 ~]# name=xiu
[root@centos7 ~]# [ tom == $name ]
[root@centos7 ~]# echo $?
1
[root@centos7 ~]# [ tom == "$name" ]
[root@centos7 ~]# echo $?
1
# 要尽量使用 [[ ]]
[root@centos7 ~]# [ 'a' > 'b' ]
[root@centos7 ~]# echo $?
0
[root@centos7 ~]# [ 'a' < 'b' ]
[root@centos7 ~]# echo $?
0
[root@centos7 ~]# [[ 'a' > 'b' ]]
[root@centos7 ~]# echo $?
1
[root@centos7 ~]# [[ 'a' < 'b' ]]
[root@centos7 ~]# echo $?
0
# 在 [] 中变量替换一定要加双引号,但是在 [[ ]] 中可以不加
[root@centos7 bin]# [ -z $a ] && echo yes || echo no
yes
[root@centos7 bin]# [ -n $a ] && echo yes || echo no
yes
[root@centos7 bin]# [ -n "$a" ] && echo yes || echo no
no
[root@centos7 bin]# [ -z "$a" ] && echo yes || echo no
yes
[root@centos7 bin]# [[ -n $a ]] && echo yes || echo no
no
[root@centos7 bin]# [[ -z $a ]] && echo yes || echo no
yes
#============================================================================
[root@centos7 ~]# name=haha
[root@centos7 ~]# echo $name
haha
[root@centos7 ~]# [[ "$name" =~ ha ]]
[root@centos7 ~]# echo $?
0
[root@centos7 ~]# [[ "$name" =~ h ]]
[root@centos7 ~]# echo $?
0
[root@centos7 ~]# [[ "$name" =~ hx ]]
[root@centos7 ~]# echo $?
1
[root@centos7 ~]# [[ "$name" =~ xx ]]
[root@centos7 ~]# echo $?
1
文件测试
单目测试:
判断文件是否存在
-e FILE 测试文件是否存在
-a FILE 测试文件是否存在
判断文件是否存在以及文件类型
-f FILE 测试是否为普通文件
-d dirname 测试是否为目录文件
-b FILE 测试文件是否存在并且是否为一个块设备文件
-c FILE 测试文件是否存在并且是否为一个字符设备文件
-h FILE 测试文件是否存在并且是否为符号链接文件
-L FILE 测试文件是否存在并且是否为符号链接文件
-p FILE 测试文件是否存在并且是否为管道文件
-S FILE 测试文件是否存在并且是否为套接字文件
判断文件权限
-r FILE 测试其执行用户是否对此文件有读取权限
-w FILE 测试其执行用户是否对此文件有写权限
-x FILE 测试其执行用户是否对此文件有执行权限
在脚本中使用source命令导入配置文件的时候,判断配置文件是否存在,同时判断执行脚本的用户对导入的文件有读权限
[ -r 配置文件 ] && source 配置文件
文件特殊权限测试:
-g FILE 测试文件是否拥有sgid权限
-u FILE 测试文件是否拥有suid权限
-k FILE 测试文件是否拥有拥有sticky权限
判断文件是否有内容
-s FILE 测试文件是否存在并且不空
判断文件时间戳
-N FILE 测试文件从上一次读操作后是否被修改过
判断从属关系
-O FILE 当前用户是否为文件的属主
-G FILE 当前用户是否属于文件的属组
判断文件是否打开
-t fd fd表示文件描述符是否已经打开且与某终端相关
双目测试:
FILE1 -nt FILE2 测试FILE1是否比FILE2更新一些(修改时间)
FILE1 -ot FILE2 测试FILE1是否比FILE2更老一些
FILE1 -ef FILE2 测试FILE1的inode号与FILE2的inode号是否一致,可以理解为两个文件是否为同一个文件,这个判断硬链接是很好的办法
演示:
1、文件存在性测试
[root@centos7 ~]# [ -e /etc/fstab ]
[root@centos7 ~]# echo $?
0
[root@centos7 ~]# [ -e /etc/rc.d/rc.sysinit ]
[root@centos7 ~]# echo $?
1
2、文件存在性及类型测试
[root@centos7 ~]# [ -b /dev/sda ]
[root@centos7 ~]# echo $?
0
[root@centos7 ~]# [ -b /dev/sdb ]
[root@centos7 ~]# echo $?
1
[root@centos7 ~]# [ -d /etc ]
[root@centos7 ~]# echo $?
0
[root@centos7 ~]# [ -L /etc/redhat-release ]
[root@centos7 ~]# echo $?
0
[root@centos7 ~]# ll /etc/redhat-release
lrwxrwxrwx. 1 root root 14 11月 6 18:30 /etc/redhat-release -> centos-release
3、文件权限及特殊权限测试
[root@centos7 ~]# ll /etc/shadow
---------- 1 root root 1400 2月 20 14:12 /etc/shadow
[centos@centos7 ~]$ whoami
centos
[centos@centos7 ~]$ [ -r /etc/shadow ]
[centos@centos7 ~]$ echo $?
1
[centos@centos7 ~]$ [ -r /etc/passwd ]
[centos@centos7 ~]$ echo $?
0
[centos@centos7 ~]$ [ -w /etc/passwd ]
[centos@centos7 ~]$ echo $?
1
# 对于root用户来讲,rw 权限是以实际为主,但执行权限是起作用的
[root@centos7 ~]# whoami
root
[root@centos7 ~]# [ -r /etc/shadow ]
[root@centos7 ~]# echo $?
0
[root@centos7 ~]# [ -w /etc/shadow ]
[root@centos7 ~]# echo $?
0
[root@centos7 ~]# [ -x /etc/shadow ]
[root@centos7 ~]# echo $?
1
#==========================================================================
[root@centos7 ~]# [ -u /usr/bin/passwd ]
[root@centos7 ~]# echo $?
0
# 说明 /usr/bin/passwd 拥有suid权限
[root@centos7 ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd
4、文件是否有内容测试
[root@centos7 ~]# touch /tmp/hello
[root@centos7 ~]# [ -s /tmp/hello ]
[root@centos7 ~]# echo $?
1
[root@centos7 ~]# [ -s /etc/fstab ]
[root@centos7 ~]# echo $?
0
5、双目测试
[root@centos7 ~]# touch f1
# 创建f22 的硬链接为f1
[root@centos7 ~]# ln f1 f22
# 是否指向同一设备上相同的inode,也就是说是否为硬链接
[root@centos7 ~]# [ f1 -ef f22 ]
[root@centos7 ~]# echo $?
0
[root@centos7 ~]# ll -i f1 f22
201391291 -rw-r--r-- 2 root root 1024 2月 23 18:39 f1
201391291 -rw-r--r-- 2 root root 1024 2月 23 18:39 f22
组合条件测试
第一种方式:逻辑判断符
逻辑与:&&(两个条件都为真的时候才为真,任何一个为假就为假)
第一个条件为假时,第二条件不用再判断,最终结果已经为假所以第二条件不执行
第一个条件为真时,第二条件必须判断;只有第二条件执行才能得最终结果
逻辑或:||(两个条件其中任何一个为真就为真,同时为假才为假)
第一个条件为假时,第二条件必须判断,只有第二条件执行才能得最终结果
第一个条件为真时,第二条件不用再判断,最终结果已经为真所以第二条件不执行
&& 命令1&&命令2 当命令1正确执行,命令2才会执行
当命令1执行不正确,命令2不会执行
|| 命令1||命令2 当命令1执行不正确时,命令2才会执行
当命令1正确执行,命令2不会执行
第二种方式:布尔运算符
EXPRESSION1 -a EXPRESSION2 逻辑与,判断1和判断2都成立,最终结果为真
EXPRESSION1 -o EXPRESSION2 逻辑或,判断1和判断2有一个成立,最终结果就为真
! EXPRESSION 取反
示例:
aa=11
[ -n “$aa” -a “$aa” -gt 23 ]&& echo yes || echo no
判断变量aa是否有值,同时判断变量aa是否大于23;因为变量aa的值不大于23,虽然第一个判断为真,但返回的结果为假输出no
注意:
布尔运算符(-a、-o、!)只能用在[ ]表达式中;如:[ 1 -eq 1 -a 2 -eq 2 ]为true
逻辑运算符(&&、||)只能用在` `和(( ))中使用
Linux Shell脚本编程-基础2的更多相关文章
- Linux shell脚本编程基础之练习篇
shell脚本编程基础之练习篇. 1.编写一个脚本使我们在写一个脚本时自动生成”#!/bin/bash”这一行和注释信息. #!/bin/bash ] then echo "请输入一个参数& ...
- Linux Shell脚本编程-基础1
概述: shell脚本在Linux系统管理员的运维工作中非常重要.shell脚本能够帮助我们很方便的管理服务器,因为我们可以指定一个任务计划,定时的去执行某一个脚本以满足我们的需求.本篇将从编程基础 ...
- Linux Shell脚本编程基础(11)
实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核,不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序.Shel编程语言具有普通编程 ...
- Linux Shell脚本编程基础
1. 脚本是一个包含一系列命令序列的文本文件,当运行这个脚本文件时,文件中包含的命令序列将得到执行. 2. 脚本主要由两部分组成:脚本解释器和命令序列 注:#!/bin/bash 指明脚本解释器为Ba ...
- linux基础—课堂随笔_03 SHELL脚本编程基础
shell脚本编程基础 条件选择:if语句 选择执行: 注意:if语句可嵌套 单分支 if(开头)判断条件:then条件为真的分支代码 fi(结尾) 双分支 if(开头)判断条件:then条件为真的分 ...
- SHELL脚本编程基础知识
SHELL脚本编程基础知识 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Linux之父Linus有一句话很经典:"Talk is cheap, show me the ...
- shell脚本编程基础介绍
Linux系统——shell脚本编程基础介绍 1.什么是shell 它是一个命令解释器,在linux/unix操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种操作输出的结果 ...
- Linux shell脚本编程(三)
Linux shell脚本编程 流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真” ...
- Linux shell脚本编程(二)
Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...
随机推荐
- JS报错:Cannot read property 'type' of undefined
在做图片上传功能的时候,遇到了JS无法识别图片type的问题,在使用过程中是没有问题的,但是不知道为什么浏览器的Console报这个错误: Uncaught TypeError: Cannot rea ...
- [转]C++ 获取文件夹下的所有文件名
转自http://www.cnblogs.com/fnlingnzb-learner/p/6424563.html 头文件:#include<io.h> char * filePath = ...
- 一袭白衣一 IDEA的破解安装以及汉化
DEA是一款比eclipse用起来更好用的一款代码编辑器,本人之前也是一直在用eclipse来写代码,后来发现了IDEA用起来会更顺手,所以又转用IDEA了,今天给大家分享一下IDEA的下载安装破解以 ...
- ZOJ 2883 Shopaholic【贪心】
解题思路:给出n件物品,每买三件,折扣为这三件里面最便宜的那一件即将n件物品的价值按降序排序,依次选择a[3],a[6],a[9]----a[3*k] Shopaholic Time Limit: 2 ...
- LR编写get请求
LR编写简单Get接口 接口必备信息:接口功能.URL.支持格式.http请求方式.请求参数.返回参数 请求地址 http://api.k780.com:88/?app=life.time 请求方式 ...
- 模块-时间模块(new)
模块-时间模块 导入: import time 方法: _STRUCT_TM_ITEMS __doc__ __loader__ __name__ __package__ __spec__ altzon ...
- CDQ分治笔记
以前一直不会CDQ……然后经常听到dalao们说“这题直接CDQ啊”“CDQ不就秒了吗”的时候我只能瑟瑟发抖QAQ CDQ分治 其实CDQ分治就是二分分治,每次将$[l,r]$的问题划分为$[l,mi ...
- Docker学习总结(4)——Docker镜像与容器命令
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).bare metal. ...
- C++容器(五):set类型
set类型 map容器是键-值对的集合,好比以任命为键的地址和电话号码.而set容器只是单纯的键的集合.当只想知道一个值是否存在时,使用set容器是最适合. 使用set容器必须包含set头文件: #i ...
- Android实战简易教程-第二十八枪(Uri转String型实例)
接上一篇文章.我们能够轻易的获取所选图片的uri,那么我们考虑怎样将获取的uri转换成String型的地址呢? 接下来我们通过实例来研究.布局文件和上篇(二十七枪)一致,我们就不再列出,直接看Main ...