文章目录
一、Shell
1、简介
这个单词的意思是“外壳的意思”,shell又被称为命令解释器。
它可以识别用户输入的各种命令,并传递给系统。和我们在终端中输入的命令类似,但功能强大的多。
shell可以是用户交互的界面,也可以说是控制系统的脚本语言。
2、Shell的分类
集中常见的Shell
- Bourne Shell:标识为sh,在许多Unix系统中,是root用户的默认的Shell。
- Bourne-Again Shell :标识为bash,大多数Linux发行版的默认的Shell。
- Korn Shell:标识为ksh,向上兼容Bourne Shell,并且包含了 C shell 的很多特性。
- C Shell:标识为csh,语法上类似C语言。。
这几种shell程序,多多少少有一些区别。但是最好用的还是Bourne-Again Shell。
3、编写Shell脚本
- 使用vim编辑器创建一个以.sh结尾的文件。
[root@test opt]# vim HelloWorld.sh
[root@test opt]# cat HelloWorld.sh
#!/bin/bash #声明解释器
#The first Shell script.Start with Hello World! #注释文本
echo "HelloWorld!" #执行指令
4、运行脚本的方式
-
(1)赋予文件可执行的权限
chmod +x 脚本文件路径 -
(2)使用解释器运行脚本
bash 脚本文件路径 -
(3)使用source命令运行脚本。
source 脚本文件路径 -
示例
[root@test opt]# chmod +x HelloWorld.sh
[root@test opt]# ./HelloWorld.sh
HelloWorld!
[root@test opt]# bash ./HelloWorld.sh
HelloWorld!
[root@test opt]# source ./HelloWorld.sh
HelloWorld!
二、条件测试
在编写Shell的时候,需要测试字符串。然后基于这些字符串是否匹配条件来选择下一步动作。
- 示例
测试两个数值是否相等
[root@test opt]# [ 1 = 1 ] #中括号、字符、运算关系符,中间都有空格。
[root@test opt]# echo $? #$?测试上一条命令执行是否正确,正确为0,失败为1.
0
[root@test opt]# [ 1 = 2 ]
[root@test opt]# echo $?
1
1、数值测试
关系运算符 | 说明 | 备注 |
---|---|---|
-eq | 等于 | |
-ne | 不等于 | |
-gt | 大于 | |
-ge | 大于等于 | |
-lt | 小于 | |
-le | 小于等于 |
- 使用常量对比
[root@test opt]# [ 1 -eq 1 ] #中括号、字符、运算关系符,中间都有空格。
[root@test opt]# echo $? #$?测试上一条命令执行是否正确,正确为0,失败为1.
0
[root@test opt]# [ 1 -lt 2 ]
[root@test opt]# echo $?
0
-
使用自定义变量进行测试。
[root@test opt]# a=100 [root@test opt]# b=110 [root@test opt]# [ $a -eq $b ] [root@test opt]# echo $? 1
-
变量的类型:
1,自定义变量
变量名称=变量的值 变量名可以是数字字母下划线,不能是数字开头,不能使用特殊符号
2,环境变量
HOSTNAME主机名 USER用户名 UID用户的id号 SHELL用户使用的解释器 PWD当前所在路径 PS1一级提示符 PS2二级提示符 HOME家目录 PATH存储命令的路径
3,预定义变量和位置变量
$0 $# $* $$ $? $1 $2 $3…
2、字符串测试
关系运算符 | 说明 | 备注 |
---|---|---|
== | 字符串相等 | |
!= | 字符串不相等 | |
-z | 字符串为空 | |
-n | 字符串不为空 |
- 示例:测试字符串是否相等
[root@test opt]# [ "abc" = "abc" ]
[root@test opt]# echo $?
0
[root@test opt]# [ "abc" = "abc" ]
[root@test opt]# echo $?
0
[root@test opt]# [ "cbc" = "abc" ]
[root@test opt]# echo $?
1
[root@test opt]# [ "cbc" != "abc" ]
[root@test opt]# echo $?
0
- 示例:判断环境变量是否为空或者非空
[root@test opt]# [ -z $string1 ]
[root@test opt]# echo $?
0 //环境变量为空
[root@test opt]#
[root@test opt]# string1="test" //对环境变量赋值
[root@test opt]# [ -z $string1 ]
[root@test opt]# echo $?
1 //环境变量不为空
3、文件状态测试
关系运算符 | 说明 | 备注 |
---|---|---|
-d | 目录 | |
-f | 普通文件 | |
-l | 链接文件(快捷方式) | |
-r | 可读文件 | 针对当前用户 |
-w | 可写文件 | 针对当前用户 |
-x | 可执行文件 | 针对当前用户 |
-u | 设置了suid | 针对当前用户 |
-s | 文件长度大于0、非空 |
- 示例
测试HelloWorld.sh文件的访问权限。
[root@test opt]# ls -l HelloWorld.sh
-rwxr-xr-x. 1 root root 79 2月 14 10:14 HelloWorld.sh
[root@test opt]# [ -r HelloWorld.sh ]
[root@test opt]# echo $?
0 //文件可读
[root@test opt]# [ -w HelloWorld.sh ]
[root@test opt]# echo $?
0 //文件可写
[root@test opt]# [ -x HelloWorld.sh ]
[root@test opt]# echo $?
0 //文件可执行
4、条件测试的逻辑操作符
逻辑操作符 | 说明 | 备注 |
---|---|---|
-a | 与 | 只有当操作符两边的条件均为真时,结果为真;否则为假 |
-o | 或 | 操作符两边的条件只要有一个为真,则结果为真;两个都为假时,结果才为假 |
! | 非 | 条件为假;结果为真 |
- 示例
[root@test opt]# cp HelloWorld.sh HelloWorld02.sh
[root@test opt]# chmod -x HelloWorld02.sh
[root@test opt]# ls -l HelloWorld.sh HelloWorld02.sh
-rw-r--r--. 1 root root 79 2月 14 14:18 HelloWorld02.sh
-rwxr-xr-x. 1 root root 79 2月 14 10:14 HelloWorld.sh
我先把HelloWorld.sh 复制一下,再改个名,把可执行权限取消掉。来做对比。
[root@test opt]# [ -r HelloWorld.sh -a -r HelloWorld02.sh ]
[root@test opt]# echo $? //测试这两个文件是否都可读
0
[root@test opt]# [ -x HelloWorld.sh -a -x HelloWorld02.sh ]
[root@test opt]# echo $? //测试这两个文件是否都可执行
1
[root@test opt]# [ -x HelloWorld.sh -o -x HelloWorld02.sh ]
[root@test opt]# echo $? //测试这两个文件当中是否有可执行文件
0
[root@test opt]# [ ! -r HelloWorld.sh ]
[root@test opt]# echo $? //测试这个文件是否不可读
1
5、 2个逻辑符号组合判断
4,多个条件/操作的逻辑组合
&& 之前任务成功就执行之后任务
ls && ls 前一个ls执行成功了,又执行了第二个ls,一共执行2次ls
|| 之前任务失败才执行之后任务
ls || ls 前一个ls执行成功了,不执行第二个ls,一共执行1次ls
#!/bin/bash
[ root != $USER ] && exit //如果不是管理员执行该脚本,则退出
yum -y install vsftpd
systemctl restart vsftpd
systemctl enable vsftpd
2个逻辑符号组合判断
&& 前后任务都成功,算该组成功
|| 前后任务有一个成功,就算该组成功
ls && ls && ls 第1个ls成功,执行第2个,前2个都成功,执行第3个
ls && ls || ls 第1个ls成功,执行第2个,前2个都成功,不执行第3个
ls || ls || ls 第1个ls成功,不执行第2个,前2个算成功,不执行第3个
ls || ls && ls 第1个ls成功,不执行第2个,前2个算成功,执行第3个
[ root == $USER ] && echo “我是管理员” || echo “我不是管理员”