什么是shell
shell编程的目的
shell编程的用户
基础配置:系统初始化操作、系统更新、内核调整等等
– 安装程序:自动部署 LNMP、LAMP、MySQL 等等
– 配置变更:Nginx 配置、MySQL 配置、Redis 配置等等
– 业务部署:配合 git、jenkins 等实现自动化持续交付
– 日常备份:脚本对项目或者软件实现全备份或者增量备份等
– 信息采集:硬件、系统、服务、网络等各种数据的自动采集
– 日志分析:获取日志、排序、去重、统计、分析
– 服务扩容:监控服务器就请你信息,脚本程序自动化扩容部署
减少重复工作,周期性工作,降低工作量
shell编程的核心
批量执行Linux的命令的操作,将手工执行多次的命令,转换到脚本程序通过命令一次性执行
脚本基本规范
? 脚本存放在 scripts/目录中
? 开头添加#!/bin/bash,确定 bash 执行命令
? 附带作者及版权信息
? 脚本扩展名为*.sh
? 脚本中尽量不用中文
? 成对的符号一次书写完成
? 循环格式一次性输入完成
注释和输入输出
注释:除第一行外,以#行注释
输出 read 读取用户输入的信息
-p:打印提示信息
-s:用户输入信息不明文显示
echo:打印信息,类似于python的print()函数
echo -n 打印信息不换行
执行shell 脚本
mkdir scripts
vim test.sh
#!/bin/bash
echo "hello world"
执行上述脚本
1. bash test.sh
2. sh.test.sh
3. chmod u+x test.sh
./test.sh
变量
什么是变量:变量时 shell 传递数据的一种方式,作为一个临时存储数据的容器,可以存放 数据并在其他需要的地方直接通过变量名称使用对应的数据。
命名规则:
? 变量定义时要求字母、数字或者下划线组成,数字不能开头。
? 大小写敏感
项目规范:见名知意、下划线命名法
vim test2.sh
#!/bin/bash
name=tom
echo "name:$name"
echo ‘name:$name‘
echo $name
echo ${name}_01
变量赋值,使用“=”符号,将=右边的结果赋值给左边的变量
等号两边不能有空格
定义的变量不要和系统命令冲突
程序控制结构
顺序结构,选择结构,循环结构
1.选择结构
单分支
if 条件;then
条件为True要执行的代码
fi
案例:查看ls命令在文件系统环境变量中的位置,查看返回ok which ls
vim 1.sh
#!/bin/bash
if which ls;then
echo ok
fi
双分支
if 条件;then
条件为True要执行的代码
else
其他情况
fi
案例:搜索当前用户有没有zhang,找到返回OK,找不到返回error
vim 2.sh
#!/bin/bash
if grep zhang /etc/passwd;then
echo "ok"
else
echo "error"
fi
多分支
if [ 条件1 ];then
执行代码1
elif [ 条件2 ];then
执行代码2
elif [ 条件3 ];then
执行代码3
else
其他情况
fi
案例操作:输入1,输出选项1,输入2,输出选项2
vim 3.sh
#!/bin/bash
read -p "请输入功能选项": choice
if [ $choice -eq 1 ];then
echo "选项1"
elif [ $choice -eq 2 ];then
echo "选项2"
elif [ $choice -eq 3 ];then
echo "选项3"
else
echo "没有此选项"
fi
= 判断相关字符是否相等
案例操作,用户输入“Q”退出系统.输入“C”,继续
vim 4.sh
#!/bin/bash
read -p "是否退出系统?(Q/退出,C/继续)" ret
if [ $ret = "Q" ];then
echo "退出系统"
elif [ $ret = "C" ];then
echo "continue"
else
echo "指令错误"
fi
case选择结构
case 变量 in
变量 1)
命令序列 1
;;
变量 2)
命令序列 2
;;
*)
无匹配后命令序列
esac
案例操作:显示功能选项界面,输入序号好功能名称都可以执行
vim 5.sh
#!/bin/bash
echo "=============="
echo " 1.login"
echo " 2.register"
echo " 3.exit"
echo "=============="
read -p "请输入功能选项" choice
case $choice in
1|login)
echo "欢迎登录"
;;
2|register)
echo "欢迎注册"
;;
3|exit)
echo "退出系统"
;;
*)
esac
for 循环
基本操作语法:
for 变量名 in [取值列表]
do
循环中重复执行的代码
done
案例:检查所有的ip地址通讯
vim 6.sh
#!/bin/bash
hosts="192.168.1.1 192.168.1.2 192.168.1.3"
for h in $hosts
do
echo "开始检查$h通讯"
sleep 1
echo "检查$h通过"
done
echo "所有ip检查通过"
while 循环
while 条件
do
循环要执行的代码
done
#案例操作:计算1-100之间的和
vim 7.sh
#!/bin/bash
num=1
sum=0
while [ $num -le 100 ]
do
sum=$[ $num + $sum ]
let num+=1
done
echo 1-100的和是$sum
函数的声明和调用
function 函数名称(){
函数中的代码
}
快捷写法
函数名(){
函数中的代码
}
案例操作
vim 8.sh
#!/bin/bash
function func1(){
echo 执行func1函数
}
func2(){
echo 执行func2函数
}
func1
func2
检查输入的ip地址是否可以ping通
vim 9.sh
#!/bin/bash
read -p "请输入你要测试的ip地址" IP
ping -w1 -c1 $IP>/dev/null
#echo $?
if [ $? -eq 0 ];then
echo "可以正常通信"
else
echo "不能通信"
fi
原文:https://www.cnblogs.com/markshui/p/12925032.html