一、概述
Shell脚本是一种编写在Unix或类Unix系统中的脚本语言,用于自动化执行一系列命令。它是一种批处理语言,可以执行多个命令、控制流程和变量操作,提供了一种简洁、高效的方式来处理和管理系统操作。
Shell脚本通常使用文本编辑器编写,以脚本文件的形式存在,并通过命令行解释器执行。在Unix系统中,通常使用Bourne shell(例如bash)、C shell或Korn shell等解释器来执行脚本。
Shell脚本能够完成很多任务,包括但不限于文件操作、目录管理、进程控制、系统配置以及运行其他程序等。通过编写Shell脚本,用户可以以一种自动化和批处理的方式执行复杂的任务,从而减少手动操作的工作量,提高工作效率。
二、原理
1、提示符:Shell会在命令行中显示一个特定的符号(通常是$或#),作为用户输入命令的提示符。
2、读取输入:用户在命令行中输入命令或脚本,并按下回车键。Shell会读取用户的输入,并将其作为待执行的命令。
3、解析命令:Shell解析用户的输入命令,将其拆分为命令和参数,并识别出命令的类型和含义。
4、执行命令:根据解析结果,Shell调用相应的程序来执行命令。程序可以是系统内置的命令,也可以是外部的可执行文件。
5、输出结果:执行命令后,Shell将结果输出到终端,供用户查看。输出可以是文本信息、错误提示、命令执行状态或其他相关信息。
6、控制流程:Shell根据命令的执行结果,可以根据条件进行分支、循环以及其他控制流程操作。这样可以实现条件判断、循环执行和错误处理等功能。
7、脚本执行:如果用户输入的是一个脚本文件,Shell会按照文件中的命令顺序逐行执行,从而实现一系列自动化任务。
三、常见的测试选项
-d测试目录
-f测试文件
-w测试写权限
-r测试读权限
-x测试执行权限
-e测试文件目录是否存在
四、常见的比较运算符
gt大于
lt小于
ge大于等于
le小于等于
eq等于
ne不等于
五、字符串的比较
=:字符串内容是否相同
!=:字符串内容是否不同
-z:检查字符串是否为空
字符串比较的应用,字符串需要使用双引号
六、逻辑测试
&&:而且或者用-a表示,两个结果为真显示
||:或,或者使用-o表示,两个判断结果只需要满足一个条件显示为真
!:否,两个判断结果不成立为真
七、语句
1、if判断
①、单分支
条件满足执行命令序列
#!/bin/bash
du=$(df | grep "/$" | awk '{print $5}' | awk -F '%' '{print $1}')
if [ $du -gt 3 ]
then
echo "使用超出"
fi
执行脚本
②、双分支
条件满足执行第一个命令序列
条件不满足执行第二个命令序列
#!/bin/bash
netstat -alnpt | grep :80 查询80端口是否启用
if [ $? -eq 0 ] 如果等于0
then 则
echo "网站正在运行" 输出网站正在运行
else 否则
echo "服务关闭,尝试安装并启用" 输出服务关闭尝试安装并启用
yum -y install httpd > /dev/null 安装httpd
systemctl start httpd 启动httpd
fi 结束
执行脚本
2、for语句
for循环语法结构:
for 变量名 in 取值列表
do
命令序列
done
使用for循环写一个乘法表
#!/bin/bash
for i in {1..9} 变量为i循环1-9
do
for ((j=1;j<=$i;j++)) 运算j=1;j<=变量i;j++表示j每次运算都会在上面的一个值上+1
do
echo -n "${j}x${i}=$(($i*$j)) "
done
echo
done
3、while循环语句
while的命令结构:
while [条件]
do
命令序列
done
使用while循环创建20个用户密码为123456
#!/bin/bash
i=1 定义变量i=1
while [ $i -le 20 ] 如果 变量i小于20
do 则循环
useradd stu$i useradd stu$1 创建用户 用户名为stu1-20
echo "123456" | passwd --stdin stu$i 修改密码
let i++ 循环方式是i每次比上一个值+1
Done 结束
查看现有的用户
4、case控制服务的基本应用
case的语法格式:
case 变量值 in
模式1)
;;
模式2)
;;
*)
默认命令序列
esac
使用case写一个控制vsftpd服务脚本
#!/bin/bash
#chkconfig:35 80 21 35表示init3 init5 80表示作为第80个程序启动 21表示端口
case "$1" in 定义变量
start)
echo "正在启动vsftpd"
;;
stop)
echo "正在停止vsftpd"
;;
restart)
echo "正在重新启动vsftpd"
;;
*)
echo "用法:$0{start|stop|restart}"
esac