一、认识shell
常用解释器 Bash , ksh , csh
登陆后默认使用shell,一般为/bin/bash,不同的指令,运行的环境也不同
二、 编写简单脚本并使用
# vim /frist.sh //编写脚本文件,简单内容
#!/bin/bash //脚本声明,时间和作者
#This is my first Shell-Script. //注释信息
cd /boot/
pwd
ls -lh vml*# chmod +x first.sh //赋予执行命令*只有赋值才能执行
方法1# . /frist.sh //执行脚本文件
方法2# sh /first.sh
方法3# source /first.sh
1.重定向
2.管道案例
[root@localhost ~]# grep “bash$” /etc/passwd | awk -F: ‘{print $1,$7}’
root /bin/bash
teacher /bin/bash
test=test2
三、变量
1.定义变量
“this is s test” 输出 this is s test
"this is a $test" 输出 this is a test2"this is a \$test" 输出 this is s \$test
2.设置全局变量
3.整数变量的运算
4.位置变量
案例
[root@hfj ~]# vi /myprog.sh
#!/bin/bash
echo "first is:"
echo "$1"
echo "second is:"
echo "$2"
echo "three is:"
echo "$3"
echo "all number is:"
echo "$#"
echo "this process is:"
echo "$0"
[root localhost ~]# ./myprog.sh one two three four five six
irst is:
one
second is:
two
three is:
three
all number is:
4
this process is:
./myprog.sh
5.赋值时使用引号:
“”双引号,允许通过$符号引用其他变量值
‘’单引号,在双引号按键的下方。禁止引用其他变量值,$视为普通字符
、、反撇号,在?按键的下方。命令替换,提取命令执行后的输出结果
6.预定义变量
$#:命令行中位置变量的个数
$*:所有位置变量的内容
$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出 错
$0:当前执行的进程/程序名
四、小实验
写欢迎脚本,显示IP地址,时间,当前用户、系统运行时间和负载、系统版本信息。
任务命令分析如下:
ifconfig -a ens160 、date 、whoami 、uptime 、uname -a
# vim /aaa
cho " Welcome to my computer"
echo "查看160端口信息"
ifconfig -a ens160 | awk 'NR==2 {print $2; exit}'
echo "查看日期"
date
echo "查看主机名称"
whoami
echo "查看运行时间"
uptime |awk '{print $1}'
echo "查看版本号"
uname -a | awk '{print $3}'
#vim .bash_profile //写入开机文件
方法2
#!/bin/bash
# 变量定义
date=$(date)
user=$(whoami)
uptime=$(uptime)
version=$(uname -a)
ip=$(ifconfig -a ens160|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}')
red='\033[31m' // 红色
blue='\033[34m' //蓝色
#显示信息
echo -e " "
echo -e "${blue}本机IP: ${red}"$ip
echo -e "${blue}时间: ${red}"$date
echo -e "${blue}当前用户: ${red}"$user
echo -e "${blue}系统运行时间: ${red}"$uptime
echo -e "${blue}版本信息: ${red}"$version
echo -e " "
五、文件测试
test
[ ] :有空格
1.常用操作符,文件比较
2.数值比较
3.字符串比较
4.逻辑测试
注意:
最后输入 echo $? 才可输出结果:结果为0 表示真确,为其他数字表示错误
六、if语句
单分支,双分支,多分支
单分支 if then(成立结果) fi结束
1.单分支实验
#!/bin/bash
MOUNT_DIR="/mnt/cdrom/"
if [ ! -d $MOUNT_DIR ]
then
mkdir -p $MOUNT_DIR
fi
当脚本可以执行时echo $?输出为0,脚本文件错误时(和执行后错误无关)显示非0
2.多分支实验
pinghost.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "Host $1 is up."
else
echo "Host $1 is down."
fi
备注:
-c 发送包数量
-i 间隔时间
-W最长等待时间
实验
编写监控脚本sysmon.sh
监控CPU使用率、内存使用率、根分区/的占用率
百分比精确到个位,如7%、12%
出现以下情况时告警:磁盘占用率超过90%、CPU使用率超过80%、内存使用率超过90%。
报警记录到日志文件/var/log/use.log。
结合计划任务,每半小时检查一次
30分钟。
分析命令:
mpstat 先安装工具包:yum install sysstat
free 查看内存占有率
df -h 文件系统使用率
if条件分支。
# vim /a3
//#!/bin/bash
//# 磁盘占有率超过90%,CPU使用率超过80%,内存使用率超过90%发送报警记录
disk=$(df -Th | grep '/$' | awk '{print $6}' | awk -F% '{print $1}')
CPU=$(expr 100 - $(mpstat | tail -1 | awk '{print $13}' | awk -F. '{print $1}'))
mem=$(expr $(free -m | grep "Mem:" | awk '{print $7}') \* 100 / $(free -m | grep "Mem:" | awk '{print $2}'))
A=/var/log/use.log
if [ $disk -ge 90 ]
then echo "磁盘占有率超过90%" >> $A
else
echo "磁盘占有率:$disk%"
fi
if [ $CPU -ge 80 ]
then echo "CPU使用率超过80%" >> $A
else
echo "CPU使用率:$CPU%"
fi
if [ $mem -ge 90 ]
then echo "内存使用率超过90%" >> $A
else
echo "内存使用率:$mem%"
fi
# crontab -e
*/30 * * * * . /a3
七、awk工具
1.选项
八、for语句
for 变量名 in 取值列表
do
命令序列
done
1.实验
批量添加用户
用户名存放在users.txt文件中,每行一个
初始密码均设为123456
验证脚本
1、编写用户列表:
[root@hfj ~]# cat userlist.txt
wangxin
anxin
jinhu
yangying
2、编写脚本
vi useradd.sh
#!/bin/bash
#add users
a=$(cat /root/userlist.txt)
for b in $a
do
useradd ${b}
echo "123456" | passwd --stdin ${b} &> /dev/null
done
3、删除用户的脚本
#!/bin/bash
a=$(cat /root/userlist.txt)
for b in $a
do
userdel -r ${b} &> /dev/null
done
十、while语句
while循环语句语法:
while 条件测试操作
do
命令序列
done
1.实验
批量添加用户
用户名称以stu开头,按数字顺序进行编号
一共添加20个用户,即stu1、stu2、……、stu20
初始密码均设为123456
#!/bin/bash
name="stu"
i=1
while [ $i -le 20 ]
do
useradd ${name}$i
echo "123456" | passwd --stdin ${name}$i &> /dev/null
let i++
done
2.实验
猜商品价格游戏;通过变量RANDOM获得随机数;提示用户猜测并记录次数,猜中后退出循环
#我这里还加了if语句填了一点其他元素。
#!/bin/bash
#
a=$(expr ${RANDOM} % 1000)
i=0
while true
do
read -p "猜猜看我想的是哪个数,范围在0~999。" shu
let i++
if [ $shu -eq $a ];then
if [ $i -lt 10 ];then
echo "太强了,你猜了$i 次就猜中了,可惜没得奖励。"
else
echo "猜了$i 次才猜中,你还差的远呢"
fi
break
elif [ $shu -lt $a ];then
if [ $(expr $a - $shu) -le 5 ] ;then
echo "虽然数小了,但已经很近了,你在想想"
else
echo "不好意思,猜的太小了"
fi
else
if [ $(expr $shu - $a) -le 5 ];then
echo "虽然数大了,但已经很近了,你在考虑考虑"
else
echo "不好意思,猜大了,数再小点"
fi
fi
done
十一、case语句
case 条件 in
条件1)
执行语句
;;
条件2)
执行语句
;;
*) //其余条件
执行语句
;;
esac
erad -p “从屏幕输入” 变量名
1.小实验
击键类型识别
·提示用户输入一个字符判断出该字符是字母、数字或者其他字符
#!/bin/bash
read -p "请在键盘输入一个 字符 :" KEY
case $KEY in
[a-z]|[A-Z])
echo "这是字母"
;;
[0-9])
echo "这是数字"
;;
*)
echo "这是其他符号"
esac
2.位置参数实验
命令后的第一个字段是$1 依次向后叠加
编写系统服务脚本
使用start、stop、restart等参数来控制服务服务控制指令通过位置变量$1传入
#!/bin/bash
case $1 in
start )
systemctl start $2
echo "开启 $2"
;;
stop )
systemctl stop $2
echo "关闭 $2"
;;
status )
systemctl status $2
echo "查询 $2"
;;
*)
systemctl restart $2
echo "重启 $2"
;;
esac