shell
1.什么是shell
shell是一个命令解释器, 将人类输入高级语言, 通过 Shell程序 转换为 二进制 .
shell分为两种使用方式:
交互: 登录 执行命令 退出
非交互: 执行某个文件, 文件中都是一推命令, 整个文件从上往下依次执行.
2.什么是shell脚本
- 将系统命令堆积在一起,顺序执行(简称: 系统命令堆积)
- 特定的格式 + 特定的语法 + 系统的命令 = 文件。 Shell脚本
if for ...
3.shell脚本能做什么
标准:
1.安装方式一致
2.安装路径一致
3.目录结构一致
4.日志格式一致
5.脚本路径一致
能将平时操作脚本化,流程化,自动化 ITIL
ppt 人 流程 技术/工具
备份
监控
自动化上线
约束标准
4.shell脚本需要的预备知识
把单个命令堆积起来就叫shell脚本,不过还有一定的规范
5.shell脚本编写规范、执行方式
执行方式分为两种:
1.加执行权限 ./script_filename.sh(chown +x script_filename.sh )
2.通过bash直接翻译 bash script_filename.sh
添加命令解释器的几种方式:
#!/usr/bin/bash
#!/usr/bin/sh
#!/usr/bin/env bash
#!/usr/bin/env python
day01
1.什么是变量variables?
变量是shell中传递数据的一种方法。
简单理解: 就是用一个固定的字符串去表示不固定的值,便于后续引用。
2.定义变量规范
1.大写开头,后面小写或数字都ok
2.变量具体一定的含义
3.注意 变量的写法 仅支持 a=1 不支持 a = 1
3.自定义变量
var="hello world"
echo {var}_log
@ 的区别?
可以看到不加引号时,二者都是返回传入的参数,但加了引号后,此时@把每个参数作为一个字符串返回
##写入次文件,当打开一个XXX.sh文件,就又头信息
[root@m01 ~]# cat .vimrc
set ignorecase
set cursorline
set autoindent
set nu
autocmd BufNewFile *.sh exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1,"#!/bin/bash")
call setline(2,"#")
call setline(3,"#********************************************************************")
call setline(4,"#Author: 一只刚刚开始吃猫粮的运维狗")
call setline(5,"#QQ: 2869192751")
call setline(6,"#Date: ".strftime("%Y-%m-%d"))
call setline(7,"#FileName: ".expand("%"))
call setline(8,"#URL: https://www.caoweiqiang.cn")
call setline(9,"#Description: The test script")
call setline(10,"#Copyright (C): ".strftime("%Y")." All rights reserved")
call setline(11,"#********************************************************************")
call setline(12,"#")
call setline(13,"")
endif
endfunc
autocmd BufNewFile * normal G
例题1:
通过位置传参方式, 创建 Linux 系统账户及密码,执行 var1.sh username password
[root@m01 shell]# cat shell05.sh
#!/bin/bash
#*****************************************************
#Author: 一只刚刚开始吃猫粮的运维狗
#QQ: 2869192751
#Date: 2019-10-28
#FileName: shell05.sh
#URL: https://www.caoweiqiang.cn
#Description: The test script
#Copyright (C): 2019 All rights reserved
#*****************************************************
#位置传参
useradd $1
echo "$2" | passwd --stdin $1
例题2:
通过位置传参方式, Linux 系统账户及密码,执行 var1.sh username password,控制最多传递两个参数。
[root@m01 111]# cat she01.sh
#!/bin/bash
#********************************************************************
#Author: 一只刚刚开始吃猫粮的运维狗
#QQ: 2869192751
#Date: 2019-10-28
#FileName: she01.sh
#URL: https://www.caoweiqiang.cn
#Description: The test script
#Copyright (C): 2019 All rights reserved
#********************************************************************
if [ $# -ne 2 ];then
echo "USAGE:$0 请传递两个参数 [ username | passwd ]"
exit
fi
useradd $1
echo "$2" | passwd --stdin $1
read用法
例题1
使用read模拟Linux登陆页面。
[root@m01 scripts]# vim var8.sh
1 #!/bin/bash
2 #
3 #**************************************************************
******
4 #Author: 一只刚刚开始吃猫粮的运维狗
5 #QQ: 2869192751
6 #Date: 2019-10-28
7 #FileName: var8.sh
8 #URL: https://www.caoweiqiang.cn
9 #Description: The test script
10 #Copyright (C): 2019 All rights reserved
11 #**************************************************************
******
12 #
13
14
15 echo "$(hostnamectl |awk -F ":" '/Operating System:/ {print $2}
')"
16 echo "Kernel $(uname -r) on an $(uname -m)"
17
18 read -p "$(hostname) Login: " acc
19 read -s -t50 -p "Password: " pw
20 echo ""
21 echo "你输入的用户名: $acc 你输入的密码是: $pw"
例题2
使用 read编写一个备份脚本,需要用户传递2个参数,源和目标。
[root@m01 scripts]# cat var9.sh
#!/bin/bash
#
#********************************************************************
#Author: 一只刚刚开始吃猫粮的运维狗
#QQ: 2869192751
#Date: 2019-10-28
#FileName: var9.sh
#URL: https://www.caoweiqiang.cn
#Description: The test script
#Copyright (C): 2019 All rights reserved
#********************************************************************
#
echo "----------请按照如下提示输入---------------"
read -p "请输入你要备份的源文件或者原文目录: " Soure
read -p "请输入你要备份的目录位置是哪里:" Dest
echo -e "\t你要备份的源是 Soure
你要备份的目标是: Dest"
read -p "你确定要备份吗?[ y | n ] " Action
if [ $Action == "y" ];then
cp -rpv $Soure $Dest
fi
例题3
使用read编写一个探测主机存活脚本,需要用户传递测试的IP地址。
1.提示用户输入IP地址
2.对用户输入的IP地址进行探测是否存活
3.判断探测结果是否成功
成功则输出成功的结果
失败则输出失败的结果
[root@m01 scripts]# cat var10.sh
#!/bin/bash
#
#********************************************************************
#Author: 一只刚刚开始吃猫粮的运维狗
#QQ: 2869192751
#Date: 2019-10-28
#FileName: var10.sh
#URL: https://www.caoweiqiang.cn
#Description: The test script
#Copyright (C): 2019 All rights reserved
#********************************************************************
#
read -p "请输入需要探测的IP地址: " ip
ping -w1 -c1 "$ip" $>/dev/null
if [ $? -eq 0 ];then
echo "$ip" is ok....
else
echo "$ip" is error.....
fi
例题4
使用read编写一个修改系统主机名称脚本。
1.打印当前的主机名称
2.提示用户输入新的主机名称
3.询问用户是否修改?
4.确定修改,执行修改命令
5.不确定修改,退出脚本
[root@m01 scripts]# cat var11.sh
#!/bin/bash
#
#********************************************************************
#Author: 一只刚刚开始吃猫粮的运维狗
#QQ: 2869192751
#Date: 2019-10-28
#FileName: var11.sh
#URL: https://www.caoweiqiang.cn
#Description: The test script
#Copyright (C): 2019 All rights reserved
#********************************************************************
#
Hostname=$(hostname)
echo "当前主机名称是: ${Hostname}"
read -p "请输入新的主机名称:" new_host
read -p "你确定要将 ${Hostname} 变更为 ${new_host} 吗?[ y | n ]: " Action
if [ Action == "y" ];then
hostname ${new_host}
hostnamectl set-hostname ${new_host}
echo "你的主机名称已经修改为 ${new_host}"
fi
4.用# ## % %% / //
[root@manager ~]# url=www.sina.com.cn
[root@manager ~]# echo $url
www.sina.com.cn
[root@manager ~]# echo $url | awk -F '.' '{print $2,$3,$4}'
sina com cn
[root@manager ~]# echo ${url}
www.sina.com.cn
------------#
[root@manager ~]# echo ${url#*.} #从头开始匹配,最短匹配
sina.com.cn
[root@manager ~]# echo ${url##*.} #从头开始匹配,最长匹配
cn
------------%
[root@manager ~]# echo ${url%.*}
www.sina.com
[root@manager ~]# echo ${url%%.*}
www
-------------/
[root@manager ~]# echo ${url/c/C}
www.sina.Com.cn
[root@manager ~]# echo ${url//c/C}
www.sina.Com.Cn
例题1
如何替换 $PATH 中的/bin/替换为/BIN/
[root@manager ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@manager ~]# echo ${PATH//bin/BIN}
例题2
变量string="Bigdata process is Hadoop, Hadoop is open source project",执行脚本后,打印输出string变量,并给出用户以下选项:
1)、打印string长度
2)、删除字符串中所有的Hadoop
3)、替换第一个Hadoop为Linux
4)、替换全部Hadoop为Linux
用户输入数字1|2|3|4,可以执行对应项的功能
[root@m01 scripts]# cat var12.sh
#!/bin/bash
#
#********************************************************************
#Author: 一只刚刚开始吃猫粮的运维狗
#QQ: 2869192751
#Date: 2019-10-28
#FileName: var12.sh
#URL: https://www.caoweiqiang.cn
#Description: The test script
#Copyright (C): 2019 All rights reserved
#********************************************************************
#
string="Bigdata process is Hadoop, Hadoop is open source project"
echo "${string}"
echo "1)、打印string长度"
echo "2)、删除字符串中所有的Hadoop"
echo "3)、替换第一个Hadoop为Linux"
echo "4)、替换全部Hadoop为Linux"
read -p "请输入以下选项: [ 1 | 2 | 3 | 4 ] : " Action
if [ $Action -eq 1 ];then
echo "${#string}"
fi
if [ $Action -eq 2 ];then
echo "${string//Hadoop/}"
fi
if [ $Action -eq 3 ];then
echo "${string/Hadoop/Linux}"
fi
if [ $Action -eq 4 ];then
echo "${string//Hadoop/Linux}"
fi
例题3
查看内存/当前使用状态,如果使用率超过80%则报警发邮件,思路如下:
1.当前内存使用百分比是多少
2.进行判断比对
如果大于80% 则触发邮件
否则,over
已使用的内存 / 总内存 * 100 = 使用的百分比
[root@m01 scripts]# cat var14.sh
#!/bin/bash
#
#********************************************************************
#Author: 一只刚刚开始吃猫粮的运维狗
#QQ: 2869192751
#Date: 2019-10-28
#FileName: var14.sh
#URL: https://www.caoweiqiang.cn
#Description: The test script
#Copyright (C): 2019 All rights reserved
#********************************************************************
#
df_use=$(free -h | grep "Mem" | awk ' {print $3/$2*100}')
if [ echo "${df_use%.*}\%" -gt 80 ];then
echo "你的磁盘使用率过高..... ${df_use%.*}%"
else
echo "你的磁盘可以正常使用......${df_use%.*}%"
fi
例题4
根据系统时间,打印今年和明年时间
[root@m01 scripts]# cat var15.sh
#!/bin/bash
#
#********************************************************************
#Author: 一只刚刚开始吃猫粮的运维狗
#QQ: 2869192751
#Date: 2019-10-28
#FileName: var15.sh
#URL: https://www.caoweiqiang.cn
#Description: The test script
#Copyright (C): 2019 All rights reserved
#********************************************************************
#
Date=$(date +%Y)
echo "今年的时间是: ${Date}"
echo "明年的时间是: $((${Date}+1))"
例题5
根据系统时间获取今年还剩下多少星期,已经过了多少星期。思路如下:
date +%j 已经过了多少天
一年有365天 已经过了 301 = 还剩下 365-301 = 64 / 7 = 还剩下多少周
已经过了 301 天 / 7 = 已经过了多少周
#!/bin/bash
Date=$(date +%j)
echo "今年已经过了 ${Date} 天"
echo "今年已经过了 $[ ${Date} /7 ] 周"
echo "今年还剩下 $[ ( 365 - ${Date} ) / 7 ] 周"
echo "从现在距离下一个新年还有 $[ 365 - ${Date} ] 天"
例题6
完成一个计算器功能: 传入2个值,然后对传入的值进行 加 减 乘 除,思路如下:
1.使用read让用户传值: 2
2.对传入的值进行运算:
3.输出对应的结果.
#!/bin/bash
echo "$1 + $2 = $[ $1 + $2 ]"
echo "$1 - $2 = $[ $1 - $2 ]"
echo "$1 * $2 = $[ $1 * $2 ]"
echo "$1 / $2 = $[ $1 / $2 ]"
echo "$1 % $2 = $[ $1 % $2 ]"