一、条件测试
1.1 测试命令
格式1:test 条件表达式 格式2:[ 条件表达式 ]
test命令和 [ ] 相同,建议使用[ ] #方框中要空格 #用test可能会不小心定义变量
1.2 文件测试
常见的测试操作符 | 含义 |
---|---|
-d | 测试是否为目录 |
-f | 测试是否为文件 |
-L | 测试是否为软连接文件 |
-r | 测试当前用户是否有权限读取 |
-w | 测试当前用户是否有权限写入 |
-x | 测试当前用户是否有权限执行 |
-e | 测试目录或文件是否存在 |
属性测试 | |
---|---|
-s FILE | 是否存在且非空 |
-t fd | 文件描述符是否在某终端已经打开 |
-N FILE | 文件自从上一次被读取之后是否被修改过 |
-O FILE | 当前有效用户是否为文件属主 |
-G FILE | 当前有效用户是否为文件属组 |
示例一:测试文件类型
1.目录文件 -d
[root@localhost ~]# [ -d /etc ] [root@localhost ~]# echo $? 0 [root@localhost ~]# [ -d /etc/passwd ] [root@localhost ~]# echo $? 1
2.普通文件 -f
[root@localhost ~]# [ -f /etc/passwd ] [root@localhost ~]# echo $? 0
3.软连接文件 -L
[root@localhost ~]# [ -L /etc/passwd ] [root@localhost ~]# echo $? 1
示例二:权限测试
1.读权限 -r
[root@localhost ~]# [ -r /etc/passwd ] [root@localhost ~]# echo $? 0
2.写权限 -w
[root@localhost ~]# [ -w /etc/passwd ] [root@localhost ~]# echo $? 0
3.执行权限 -x
[root@localhost ~]# [ -x /etc/passwd ] [root@localhost ~]# echo $? 1
1.2 整数比较
只能用于整数
格式 [ 整数1 操作符 整数2 ]
-
-eq:第一个数等于(Equal)第二个数
-
-ne:第一个数不等于(Not Equal)第二个数
-
-gt:第一个数大于(Greater Than)第二个数
-
-lt:第一个数小于(Lesser Than)第二个数
-
-le:第一个数小于或等于(Lesser or Equal)第二个数
-
-ge:第一个数大于或等于(Greater or Equal)第二个数
[root@test1 ~]# a=2 实例 [root@test1 ~]# b=3 [root@test1 ~] [ $a -eq $b ] [root@test1 ~]# echo $? 1 [root@test1 ~]# [ 2 -le 3 ] [root@test1 ~]# echo $? 0
1.3 字符串比较
记得加空格
常用的测试操作符**
-
=:字符串内容相同
-
!=:字符串内容不同,! 号表示相反的意思
-
-z:字符串内容为空
-
-n: 字符是否存在
格式
[ 字符串1 = 字符串2 ] 是否相同
[ 字符串1 != 字符串2 ] 是否不相同
[ -z 字符串 ] 是否为空
[ -n 字符串 ] 字符是否存在
[root@xkj ~]# str1=xia [root@xkj ~]# str2=li [root@xkj ~]# [ $str1 =$str2 ] [root@xkj ~]# [ $str1 = $str2 ] [root@xkj ~]# echo $? 1 [root@xkj ~]# str3=xia [root@xkj ~]# [ $str1 = $str3 ] [root@xkj ~]# echo $? 0
1.4 逻辑测试
格式 [ 表达式1 ] 操作符 [ 表达式2 ] 命令1 操作符 命令2
操作符 | 含义 |
---|---|
-a或&& | 逻辑与,全真才为真 |
-o | 逻辑或,一真即为真 |
! | 逻辑否 |
1.4.1 逻辑与 &&
CMD1 && CMD2 #同时满足命令1 和命令2 的要求 才会返回正确 ,输出命令2的结果
全真才为真 一假即为假 第一个CMD1结果为真 ,第二个CMD2必须要参与运算,才能得到最终的结果
第一个CMD1结果为假 ,总的结果必定为假,因此不需要执行CMD2
[root@xkj ~]# mkdir /test/{aa,bb} && ls mkdir: 无法创建目录"/test/aa": 没有那个文件或目录 mkdir: 无法创建目录"/test/bb": 没有那个文件或目录 #前一个命令无法执行,无结果 [root@xkj ~]# mkdir /etc/{aa,bb} && ls anaconda-ks.cfg initial-setup-ks.cfg nginx-1.18.0.tar.gz.1 公共 图片 音乐 bjc.sh install_nginx.sh xkj.sh 模板 文档 桌面 cai.sh nginx-1.18.0.tar.gz yes.sh 视频 下载 [root@xkj ~]# #前一个命令执行即两个命令都能执行
1.4.2 逻辑或 ||
CMD1 || CMD2 #命令1满足要求,直接输出命令1的结果,不需要命令2参与 #如果命令1不满足要求,命令2满足,会输出命令2的结果
一真即为真 第一个CMD1结果为真 (1),总的结果必定为1,因此不需要执行CMD2 第一个CMD1结果为假 (0),第二个CMD2 必须要参与运算,才能得到最终的结果
[root@xkj ~]# mkdir /test/{aa,bb} || ls mkdir: 无法创建目录"/test/aa": 没有那个文件或目录 mkdir: 无法创建目录"/test/bb": 没有那个文件或目录 anaconda-ks.cfg initial-setup-ks.cfg nginx-1.18.0.tar.gz.1 公共 图片 音乐 bjc.sh install_nginx.sh xkj.sh 模板 文档 桌面 cai.sh nginx-1.18.0.tar.gz yes.sh 视频 下载 #有一个能执行就有结果
1.4.3 组合应用
用法只有一种
cmd1 && cmd2 || cmd3
#短路与必须在短路或前
[root@xkj ~]# mkdir -p 11/22 && pwd || ls /root #前面的命令正确因此不会执行ls [root@xkj ~]# mkdir -p 11/22 && xx || ls bash: xx: 未找到命令... 11 initial-setup-ks.cfg xkj.sh 视频 音乐 anaconda-ks.cfg install_nginx.sh yes.sh 图片 桌面 bjc.sh nginx-1.18.0.tar.gz 公共 文档 cai.sh nginx-1.18.0.tar.gz.1 模板 下载 #前面的命令有误,直接执行ls
1.5 多个命令组合执行 ( ) { }
()会开启子shell
{ } 不会开启子shell
( cmd1; cmd2; ... )
{ cmd1; cmd2 ; cmd3 }
#{}和 () 中要加空格 #多条命令要用; 隔开
[root@xkj mnt]# { cd /opt ; ls ; } rh
二、if语句
2.1单分支结构
#单分支格式#
if [ 判断条件 ] then ; echo " " else echo " " fi
2.2 多分支结构
#多分支# if [ 判断 ] then echo " " elif[ ] #可以无限elif if ... fi else #以上条件都为假 echo " " fi # if 和 fi要对应
三、case语句
3.1 case语句结构
#基本结构# case 变量名 in 值1) # 匹配值1时执行的代码块 ;; 值2) # 匹配值2时执行的代码块 ;; 值3) # 匹配值3时执行的代码块 ;; *) # 不匹配任何值时执行的代码块,类似于default语句 ;; esac
case支持glob风格的通配符:
*任意长度任意字符 ? 任意单个字符 [0-9] 指定范围内的任意单个字符 | 或者,如: a|b
#可以用嵌套结构# case 变量名 in 值1) case 变量名 in 值a) .... ;; 值b) .... ;; *) .... ;; esac ;; 值2) .... ;; *) .... ;; esac #一个case就要有一个esac对应
四、echo命令详解
echo -n 表示不换行输出 echo -e 表示输出转义符 常用的转义符
选项 | 作用 |
---|---|
\r | 光标移至行首,并且不换行 |
\s | 当前shell的名称,如bash |
\t | 插入Tab键,制表符 |
\n | 输出换行 |
\f | 换行,但光标仍停留在原处 |
\ | 表示插入“\”本身转义 |
\b | 表示退格 不显示前一个字符 |
\c | 抑制更多的输出或不换行 |
#自动磁盘分区# #以/dev/sdb 为例 echo -e "n\n\n\n\n\nw" | fdisk /dev/sdb
[root@xkj ~]# echo -e "n\n\n\n\n\nw" | fdisk /dev/sdb 欢迎使用 fdisk (util-linux 2.23.2)。 更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。 Device does not contain a recognized partition table 使用磁盘标识符 0x50934b96 创建新的 DOS 磁盘标签。 命令(输入 m 获取帮助):Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): Using default response p 分区号 (1-4,默认 1):起始 扇区 (2048-41943039,默认为 2048):将使用默认值 2048 Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):将使用默认值 41943039 分区 1 已设置为 Linux 类型,大小设为 20 GiB 命令(输入 m 获取帮助):The partition table has been altered! Calling ioctl() to re-read partition table. 正在同步磁盘。