一、条件测试
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@hzw ~]# str1=xia
[root@hzw ~]# str2=li
[root@hzw ~]# [ $str1 =$str2 ]
[root@hzw ~]# [ $str1 = $str2 ]
[root@hzw ~]# echo $?
1
[root@hzw ~]# str3=xia
[root@hzw ~]# [ $str1 = $str3 ]
[root@hzw ~]# echo $?
0
1.4 逻辑测试
格式 [ 表达式1 ] 操作符 [ 表达式2 ] 命令1 操作符 命令2
| 操作符 | 含义 |
|---|---|
| -a或&& | 逻辑与,全真才为真 |
| -o | 逻辑或,一真即为真 |
| ! | 逻辑否 |
1.4.1 逻辑与 &&
CMD1 && CMD2 #同时满足命令1 和命令2 的要求 才会返回正确 ,输出命令2的结果
全真才为真 一假即为假 第一个CMD1结果为真 ,第二个CMD2必须要参与运算,才能得到最终的结果
第一个CMD1结果为假 ,总的结果必定为假,因此不需要执行CMD2
[root@hzw ~]# mkdir /test/{aa,bb} && ls
mkdir: 无法创建目录"/test/aa": 没有那个文件或目录
mkdir: 无法创建目录"/test/bb": 没有那个文件或目录
#前一个命令无法执行,无结果
[root@hzw ~]# 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@hzw ~]#
#前一个命令执行即两个命令都能执行
1.4.2 逻辑或 ||
CMD1 || CMD2 #命令1满足要求,直接输出命令1的结果,不需要命令2参与 #如果命令1不满足要求,命令2满足,会输出命令2的结果
一真即为真 第一个CMD1结果为真 (1),总的结果必定为1,因此不需要执行CMD2 第一个CMD1结果为假 (0),第二个CMD2 必须要参与运算,才能得到最终的结果
[root@hzw ~]# 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@hzw ~]# mkdir -p 11/22 && pwd || ls
/root
#前面的命令正确因此不会执行ls
[root@hzw ~]# 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@hzw 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@hzw ~]# 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.
正在同步磁盘。