而在Linux的庞大生态系统中,Shell编程无疑是连接用户与系统内核的桥梁,它让我们能够通过简单的命令和脚本,实现对系统的灵活控制和自动化管理。
shell脚本前言 shell脚本入门 shell变量基础 shell变量子串 shell数值运算 条件表达式 流程控制语句 shell函数 case语句 shell变量数组
shell脚本前言
| 为什么学习shell编程
Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具,Linux/UNIX系统的底层及基础应用软件的核心大部分涉及Shell脚本的内容
每一个合格的Linux系统管理员或运维工程师,都需要熟练的编写Shell脚本语言,并能够阅读系统及各类软件附带的Shell脚本内容
只有这样才能提升运维人员的工作效率,适应日益复杂的工作环境,减少不必要的重复工作,从而为个人的职场发展奠定较好的基础
| 学好Shell编程所需的基础知识
能够熟练使用vim编辑器,熟悉SSH终端 有一定的Linux命令基础,至少需要掌握80个以上Linux常用命令,并能够熟练使用它。 要熟练掌握Linux正则表达式及三剑客命令(grep,sed,awk)
| 如何学好Shel编程
学好Shel编程的核心:多练-->多思考-->再练-->再思考,坚持如此循环即可! 新手大忌:不可拿来主义,可以模仿,但是要自己嚼烂了吃下去。 格言:你觉得会了并不一定会了,你认为对的并不一定对的。
shell脚本入门
| shell是什么?
Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出屏幕返回给用户 这种对话方式可以是: 交互的方式:从键盘输入命令,通过/bin/bash的解释器,可以立即得到shell的回应 非交互的方式:脚本
| Shell能做什么?
安装操作系统:CentOS6.X和CentOS7.X 手动方式安装或克隆方式自动化安装:cobbler、kickstart 底层都是shell脚本实现 优化 SSH:关闭Selinux 优化防火墙,放行 80、443、SSH端口、zabbix监控等服务访问端口 个人需求:加大文件描述符、时间同步、硬件时间、软件时间、YUM源等,都可以写入shell脚本 安装服务 Nginx、Apache Tomcat、PHP、MySQL、Redis、Mongo、docker等例如:PHP5.4和PHP7.1写入shell脚本,实现自动化安装不同版本的服务 代码上线:shell脚本自动化发布自动化回滚 zabbix监控:硬件、软件、进程、端口号、自定义监控都可以通过shell脚本+定时任务完成 日志分析日志统计:命令三剑客+定时任务+shell脚本来实现在ELK集群上的日志展示 业务层面 辅助开发程序:nohup和python的大量的日志处理
| 如何Shell编程
重点掌握前面的内容:变量、判断、bash,对它们彻底理解 先看懂,读懂shell脚本 讲完判断,将前面学过的脚本进行完善 自己写简单的脚本,如一些小的项目:生活中:随机点餐、大保健、会员办理,消费、服务 对应价格不同 结账 会员账号 密码 密码丢失 有基本适合自己的教材,如:跟老男孩学习Shell编程或者完善的文档 不能拿来及用,要搞懂、变成自己的,吸收了后可以解决企业中大部分的shell问题
一个shell脚本
# cat test.sh #!/bin/bash
echo "Hello World!"
| 执行脚本的三种常用的方式
# sh test.sh
Hello World!
# bash test.sh
Hello World!
(2)使用路径方式
全路径执行方式或者当前路径,必须给x权限
# chmod +x test.sh
# /server/scripts/test.sh
Hello World!
# ./test.sh
Hello World!
(3)使用source或者 . 的方式
# . test.sh
Hello World!
# source test.sh
Hello World!
(4)其他shell的执行方式
# cat test.sh | bash
Hello World!
# echo ls | bash
test.sh
# bash < test.sh
Hello World!
shell变量基础
| 什么是变量
shell变量是一种很“弱”的变量,默认情况下,一个变量保存一个串,shell不关心这个串是什么含义,所以若要进行数学运算,必须使用一些命令例如let、declare、expr、双括号等。
shell变量可分为两类:局部变量和环境变量
局部变量只在创建它们的shell中可用
环境变量则可以在创建它们的shell及其派生出来的任意子进程中使用
有些变量是用户创建的,其他的则是专用shell变量
变量名必须以字母或下划线字符开头,其余的字符可以是字母、数字(0~9)或下划线字符
变量名字是大小写敏感的,环境变量推荐设置为字母大写
给变量赋值时,等号周围不能有任何空白符,为了给变量赋空值,可以在等号后跟一个换行符
变量删除:用set命令可以查看所有的变量,unset var命令可以清除变量var,var相当于没有定义过
变量只读:readonly var可以把var变为只读变量,定义之后不能对var进行任何更改
对shell变量的引用方式很多,用这些方式可以方便的获取shell变量的值,变量值的长度,变量的一个字串,变量被部分替换后的值等等。
| 变量值的定义
字符串定义
# name=Iamlizhenya# name='I am lizhenya'# name="I am lizhenya"# echo $nameI am lizhenya
双引号和单引号的区别:双引号解析变量,单引号所见即所得不能解析变量,不加引号可以解析变量
数字的定义
# age="12 23 432"# echo $age12 23 432
命令的定义
通过``调用命令
# date +%F-%H-%M-%S
2022-07-07-18-02-34
# time=`date +%F-%H-%M-%S`
# echo $time
2022-07-07-18-02-40
# 时间是固定 每次调用都相同
# echo $time
2022-07-07-18-02-40
通过$()调用命令
# time=$(date +%F-%H-%M-%S)
# echo $time
2022-07-07-18-02-52
| 变量可以定义变量
# ip=`ifconfig eth0|awk 'NR==2{print $2}'`
# echo $ip
10.0.0.7
# dir=${ip}_${time}
# echo $dir
10.0.0.7_2022-07-07-18-11-34
当shell脚本中出现2条以上相同的命令就将它们写成变量
| 核心位置变量
echo hehe...........
shell函数
函数是命令的集合 完成特定功能的代码块 函数代码块 方便复用 函数类似变量 只有先定义才能执行
区别:变量不调用也会执行 name=oldboy 函数只有调用才会执行代码
| 函数的定义
#!/bin/sh
fun1(){
echo "函数的第一种定义方式"
}
fun1
function fun2 {
echo "函数的第二种定义方式"
}
fun2
function fun3(){
echo "函数的第三种定义方式"
}
fun3
案例: 菜单
#!/bin/sh fun1(){ echo -e "\t\t\t\t1.包子" echo -e "\t\t\t\t2.麻辣烫" echo -e "\t\t\t\t3.小米粥" echo -e "\t\t\t\t4.汉堡" echo -e "\t\t\t\t5.烧烤" } fun1
| 函数复用
# cat 1.sh
#!/bin/bash
. /server/scripts/day4/test.sh
fun3
# sh 1.sh
函数的第三种定义方式
# cat test.sh
#!/bin/sh
fun1(){
echo "函数的第一种定义方式"
}
function fun2 {
echo "函数的第二种定义方式"
}
function fun3(){
echo "函数的第三种定义方式"
}
案例: 函数的传参
函数调用在函数名称的后面
fun1 参数1 参数2 参数3 对应函数中的 $1 $2 $3
函数判断文件是否存在
# cat fun.sh
#!/bin/sh
fun1(){
if [ -f $1 ];then
echo "$1 文件存在"
else
echo "$1 文件不存在"
fi
}
fun1 /etc/hosts
# sh fun.sh
/etc/hosts 文件存在
# cat fun.sh
#!/bin/sh
fun1(){
if [ -f $3 ];then
echo "$3 文件存在"
else
echo "$3 文件不存在"
fi
}
fun1 /etc/hosts /etc/passwd /etc/fsttttttt
# sh fun.sh
/etc/fsttttttt 文件不存在
# cat fun.sh
#!/bin/sh
fun1(){
if [ -f $1 ];then
echo "$1 文件存在"
else
echo "$1 文件不存在"
fi
}
fun1 $2
# sh fun.sh /etc/passwd /etc/hosts
/etc/hosts 文件存在
函数可以识别变量
#!/bin/shfile=$1fun1(){ if [ -f $file ];then echo "$file 文件存在" else echo "$file 文件不存在" fi}fun1# sh fun.sh /etc/hosts/etc/hosts 文件存在
| 函数变量
可以识别全局变量 函数外的都是当前shell的全局变量
只在函数内生效的变量定义
# cat fun.sh
#!/bin/sh
fun1(){
local num=20
for i in `seq $num`
do
total=$[$count+$i]
done
echo "当前运算的结果是: $total"
}
fun1
echo $num
# sh fun.sh
当前运算的结果是: 20
函数的返回值return
# cat fun.sh
#!/bin/sh
fun1(){
echo 100
return 50
}
result=`fun1`
echo "当前函数的返回值是: " $?
echo "当前函数的执行结果: " $result
# sh fun.sh
当前函数的返回值是: 50
当前函数的执行结果: 100
利用返回值来判断
错误写法
错误写法一:
#!/bin/sh
fun1(){
if [ -f $1 ];then
return 50
else
return 100
fi
}
fun1 $1
[ $? -eq 50 ] && echo "文件存在"
[ $? -eq 100 ] && echo "文件不存在"
错误写法二:
#!/bin/sh
fun1(){
if [ -f $1 ];then
return 50
else
return 100
fi
}
fun1 $1
if [ $? -eq 50 ];then
echo 文件存在
elif [ $? -eq 100 ];then
echo 文件不存在
fi
解决方法:
[ $? -eq 50 ] && echo 文件存在 || echo 文件不存在
if [ $? -eq 50 ];then
echo 文件存在
else
echo 文件不存在
fi
赋值的方式
re=$?
if [ $re -eq 50 ];then
echo 文件存在
elif [ $re -eq 100 ];then
echo 文件不存在
fi
来源:运维基地,版权归原作者所有,如有侵权,请联系我们修改或删除。
发表评论 取消回复