shell脚本实际案例

意外空格,变成意外结果

[root@localhost shell]# echo hello >test file
[root@localhost shell]# ls
test
[root@localhost shell]# cat test 
hello file
这个纯粹就是一个意外

基础学习可以参考博客
https://blog.youkuaiyun.com/huayangshiboqi/article/details/79947564

1.shell脚本实例 for循环

乘法口诀

for i in $(seq 9); do  for j in $(seq $i); do echo -n "$i*$j=$(($i*$j))  "; done;echo ""; done

11=1
2
1=2 22=4
3
1=3 32=6 33=9
41=4 42=8 43=12 44=16
51=5 52=10 53=15 54=20 55=25
6
1=6 62=12 63=18 64=24 65=30 66=36
7
1=7 72=14 73=21 74=28 75=35 76=42 77=49
81=8 82=16 83=24 84=32 85=40 86=48 87=56 88=64
91=9 92=18 93=27 94=36 95=45 96=54 97=63 98=72 9*9=81
解释:
1、[root@localhost shell]# echo $(seq 9) //1到9的意思
1 2 3 4 5 6 7 8 9
for循环:for arg in Range;do CMD;done
2、序列数据(seq 开始 步长 最后) —步长默认1
但是也可以修改默认值
[root@localhost shell]# echo $(seq 1 2 10)
1 3 5 7 9

2.数字技术

shell中涉及的算术计算与其他语言一样(或其他语言与shell一样,顺序请强迫症患者忽略),有加(+)、减(-)、乘(*)、除(/)、取模(\)、取余(%)、求幂(**)。

以加法为例,其他的作为参考

[root@localhost shell]# echo $[2+3]
5
[root@localhost shell]# echo $((2+3))
5
[root@localhost shell]# let i=3+2
[root@localhost shell]# echo $i
5
//以上这三种的计算方式,结果都是一样的

3.shell是不支持小数运输的 ,要结合bc或者awk

[root@localhost shell]# echo 0.310-1 |bc
2.0
[root@localhost shell]# awk 'BEGIN{print 0.3
6-0.3}’
1.5

特情分享

  1. 今天写脚本做了一个系统时间的定义是时候,一不 小心敲错了,就把结果

[root@localhost shell]# date “+%y%m%d”
181224
[root@localhost shell]# date “+%Y%m%d”
20181224

脚本实例

http://blog.51cto.com/13520779/2093146
https://blog.youkuaiyun.com/zxllynu/article/details/85227007

这个博文写的案例还是挺实用的
https://blog.youkuaiyun.com/hxpjava1/article/details/79745221
这是一篇关于语法结构的解释比较好的文章,适合初学者
https://blog.youkuaiyun.com/qq3401247010/article/details/78005372
这个是定时任务脚本
http://www.51testing.com/html/71/n-3723971.html

这个视频课程好像值得拥有18个案例
http://edu.51cto.com/course/15585.html
以下这个博客是判断文件 ,目录 ,权限 变量是否为空
https://www.jb51.net/article/113695.htm

在编写shell 脚本的时候,还有判定的选择

[ -f " f i l e " ] 判 断 file" ] 判断 file"]file是否是一个文件
[ a − l t 3 ] 判 断 a -lt 3 ] 判断 alt3]a的值是否小于3,同样-gt和-le分别表示大于或小于等于
[ -x " f i l e " ] 判 断 file" ] 判断 file"]file是否存在且有可执行权限,同样-r测试文件可读性
[ -n " a " ] 判 断 变 量 a" ] 判断变量 a"]a是否有值,测试空串用-z
[ “ a " = " a" = " a"="b” ] 判断 a 和 a和 ab的取值是否相等
[ cond1 -a cond2 ] 判断cond1和cond2是否同时成立,-o表示cond1和cond2有一成立

脚本中的判断语句可以 参考以下博文(这博文有判断,语句分析语句,函数 运算)这个shell脚本的编写规范都可以使用这个博文
https://www.cnblogs.com/yangyanfei/p/6386831.html

4.写一个ping IP的脚本
#!/bin/bash

### 输入IP 地址
read -p "please input ip:" IP

### ping IP 的命令 并判断是否该IP 是否开启
ping -c3  -w 10s $IP &> /dev/null && echo $IP is up || echo $IP is down

ping -c 3 -w 10s 127.0.0.1 和 ping 127.0.0.1 -c 3 -w 10s 是一样的逻辑结构

5.写一个倒时脚本,用来统计时间
#!/bin/bash

### This script is time count down
### 2017-04-27
### by gan_ke

MIN=10
for ((s=10;s>=0;s--))
do

    echo -n "10:${s}"
    echo -ne "\r"
    sleep 1

    if
    [ "$s" -eq "0" ]
    then

        for ((s=59;s>0;s--))
        do
            echo -n "0:${s}"
            echo -ne "\r"
            sleep 1
        done
    fi

done

计时器主要用到了for循环来实现,每一秒可以用sleep 1 来实现。然后就是逻辑的构造,首先让秒先循环,直到秒为0,分钟为1的时候,进入子循环,分钟被赋值为0,秒被赋值为59。其次就是刷新的问题,如果不做任何处理,每一秒都会打印出一个时间,这里我们用到了echo -n “1:${s}” echo -ne “\r”来实现刷新。

6.创建多组用户,并创建密码

#!/bin/bash
for i in `seq 1 3`
do
useradd -G tang king$i;
echo king$i | passwd king$i --stdin;
done

这是一个很简单的脚本,但是又经常被用到,所以这个脚本是最基本的shell脚本基本功

把这些创建的用户给删了

sed -i ‘/king/d’ /etc/group
sed -i ‘/king/d’ /etc/passwd
for i in {1…3}; do rm -rf king$i; done

要写一个复制有用数据的意思

ll |grep 20190107| awk ‘{print $6}’

find /tang/ -name “CSVCGET_0001*” -a -name “*20190107_001” -exec cp {} /opt ;

 find . -type f  -mtime -1 | wc -l
40
find . -type f -mtime -1  -exec cp {} /opt \;

其实都不用,就一个命令就足够了 这个是在虚拟机上操作的命令,压根就不用

应对生产环境,还是写了一个小脚本


#!/bin/bash
## 判断拷贝目录是否存在
if [ ! -d "/king" ];then
mkdir /king
fi

## 进入数据目录
cd /tang

## find查询一天内修改过的文件 ,并拷贝一个新的目录下
find . -type f -mtime -1  -exec cp {} /king \;

## 对新拷贝的文件进行压缩

zip -r /tang.zip /king

编写一个脚本用于关闭 开启 检验服务

http://www.mamicode.com/info-detail-1615943.html

shell脚本中关于 自动输入密码
https://blog.youkuaiyun.com/zhangjikuan/article/details/51105166

shell脚本的案例
https://blog.youkuaiyun.com/qq_36441027/article/details/80214259

http://blog.51cto.com/hujiangtao/1933288

系统监控脚本

https://www.cnblogs.com/createyuan/p/3959616.html

这个博文里记录了,很多都是生产环境下,对系统性能的脚本
https://www.cnblogs.com/zwgblog/p/5792470.html

logrotate 这个命令是centos 自带的命令

rpm -ql logrotate 查看命令的软件包信息
[root@localhost ~]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf 主配置文件
/etc/logrotate.d 主配置目录
/etc/rwtab.d/logrotate
/usr/sbin/logrotate
/usr/share/doc/logrotate-3.8.6
/usr/share/doc/logrotate-3.8.6/CHANGES
/usr/share/doc/logrotate-3.8.6/COPYING
/usr/share/man/man5/logrotate.conf.5.gz
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate
/var/lib/logrotate/logrotate.status
 logrotate的配置文件是/etc/logrotate.conf,通常不需要对它进行修改。日志文件的轮循设置在独立的配置文件中,它(们)放在/etc/logrotate.d/目录下。

关于日志的分割可以参考
https://www.cnblogs.com/clsn/p/8428257.html

7.写一个显示系统前三条的脚本

#!/bin/bash
for (( i=1;i<4;i++)) ; do   date  -d  '-'"$i"'days'   +'%Y%m%d'; done 

写这个脚本的注意事项:
1.i 的()这个要注意,是定义一个符号
2、; 这个符号也是要注意事项
3、 -$i和days 之间不可以有空格,
4、 days 要有s
5、 Y m d 这几个字母要注意大少写

换一种写法吧!!!!

for i in {1..3}; do  date  -d " -$i days"  +"%Y-%m-%d"; done

现实生产环境的脚本

cd ~/log/error/archive
for ((i=6;i<28;i++))
do
d=$(date -d '-'"$i"' days' +'%Y-%m-%d')
echo "${d}: "`zcat error${d}_10.101.40.4?.tar.gz | grep -a "$1"|wc -l` >> ssoerr.log
done

8.如何调用脚本

https://blog.youkuaiyun.com/weixin_44224288/article/details/88248378

9.监控内存的告警脚本, 对应MySQL web 磁盘 都是用同一种方法进行进行监控

  • 内存监控:
#!/bin/sh
a=`free -m | awk '/Mem/{print $4}'`
if [ $a > 200 ];
then
   echo "当前内存为$a,内存不足,请及时处理"
fi
  • 磁盘监控。为了画面更加好看,可以使用,颜色标签
#!/bin/sh
a=`df -h | sed -n '2p' | awk '{print $4}'`
ip=`ifconfig  ens33 |sed -n '2p' |awk '{print $2}'`
if [ a > 10g ];
then
 echo -e  "\033[31m 主机$ip \033[0m ,\033[34m当前的可用磁盘大少为$a \033[0m, \033[35m磁盘已经占满请求处理\033[0m"
fi
<think>好的,我现在需要帮用户找一个业务巡检的Shell脚本实际案例,并且需要具体的代码示例或实现方法。首先,我得回顾一下用户提供的引用内容,看看有没有相关的信息可以利用。 用户提供的引用中有几个关于巡检脚本的例子,比如引用1提到Oracle巡检脚本,使用sqlplus执行多个SQL文件生成报告,然后调用Python处理。引用4是关于系统巡检的,包括基本信息、系统信息、服务信息等的检查。用户需要的是业务巡检,可能和系统巡检有所不同,但可以参考结构。 业务巡检可能需要检查应用程序的状态、服务端口、日志错误、数据库连接、资源使用情况等。需要结合具体的业务需求,比如检查关键进程是否运行,服务端口是否监听,日志是否有错误,数据库连接是否正常,磁盘空间是否足够等。 接下来,我需要根据这些信息构建一个Shell脚本的示例。需要注意使用中文注释,结构清晰,并且包含实际可用的代码。同时,需要确保符合用户提到的系统级指令,比如行内数学表达式用$...$,但在这个问题中可能用不到数学公式,不过还是要注意格式。 需要参考引用中的示例,比如引用1中的Oracle巡检使用循环执行SQL脚本,生成HTML报告。引用4中的系统巡检指标,可以借鉴其中的命令,比如检查主机名、CPU、内存、磁盘、进程等。 可能还需要包括日志分析的部分,比如检查最近是否有错误日志。数据库连接部分可以参考引用3中的Oracle连接信息,使用sqlplus执行简单的查询,比如SELECT SYSDATE FROM DUAL来测试连接。 另外,需要考虑如何输出报告,可能是生成一个文本文件,包含各个检查项的结果。在脚本中定义输出文件,使用日期时间戳作为文件名的一部分,方便记录每次巡检的结果。 需要处理错误情况,比如如果某个检查失败,应该在报告中标记出来。例如,如果关键进程不存在,或者端口未监听,或者数据库连接失败,都需要在报告中显示警告信息。 可能还需要使用一些工具,比如curl检查Web服务状态码,ss或者netstat检查端口,ps检查进程,df检查磁盘空间,free检查内存,top或uptime检查负载等。 最后,确保脚本的可读性和可维护性,使用函数来组织各个检查模块,比如分为系统检查、服务检查、日志检查、数据库检查等部分。 现在,把这些思路整合成一个具体的Shell脚本示例,确保代码正确,并且注释清晰,用户能够理解每个部分的作用。同时,生成相关问题,帮助用户进一步深入学习。</think>### 业务巡检Shell脚本实际案例 以下是一个综合性的业务巡检脚本示例,包含系统健康检查、服务状态验证和业务指标采集: ```bash #!/bin/bash # 业务巡检脚本 v1.0 # 生成带时间戳的报告文件 REPORT_FILE="/var/log/biz_check/巡检报告_$(date +%Y%m%d%H%M).log" # 定义颜色代码[^4] RED=&#39;\033[0;31m&#39; GREEN=&#39;\033[0;32m&#39; NC=&#39;\033[0m&#39; # No Color # 初始化报告文件 echo "====== 业务巡检报告 $(date) ======" > $REPORT_FILE # 函数:检查系统基础指标 check_system(){ echo -e "\n[系统基础检查]" | tee -a $REPORT_FILE # CPU负载检查(最近15分钟) load15=$(uptime | awk -F &#39;load average: &#39; &#39;{print $2}&#39; | cut -d, -f3) if [ $(echo "$load15 > 2" | bc) -eq 1 ]; then echo -e "${RED}警告: 15分钟平均负载过高 → $load15${NC}" | tee -a $REPORT_FILE else echo -e "CPU负载: ${GREEN}正常 ($load15)${NC}" | tee -a $REPORT_FILE fi # 内存使用率检查 mem_usage=$(free | awk &#39;/Mem/{printf "%.2f", $3/$2*100}&#39;) echo "内存使用率: $mem_usage%" | tee -a $REPORT_FILE # 磁盘空间检查(/根分区) disk_usage=$(df -h / | awk &#39;NR==2{print $5}&#39;) echo "根分区使用率: $disk_usage" | tee -a $REPORT_FILE } # 函数:检查核心业务服务 check_services(){ echo -e "\n[服务状态检查]" | tee -a $REPORT_FILE # 服务列表定义 declare -A services=( ["Web服务"]="80" ["数据库服务"]="1521" ["消息队列"]="5672" ) # 端口检查 for service in "${!services[@]}"; do port=${services[$service]} if ss -lnt | grep -q ":$port "; then echo -e "$service: ${GREEN}运行中 (端口 $port)${NC}" | tee -a $REPORT_FILE else echo -e "${RED}警告: $service 未监听端口 $port${NC}" | tee -a $REPORT_FILE fi done # 进程检查示例 if pgrep -x "java" >/dev/null; then echo -e "JAVA进程: ${GREEN}存在${NC}" | tee -a $REPORT_FILE else echo -e "${RED}警告: JAVA进程不存在${NC}" | tee -a $REPORT_FILE fi } # 函数:数据库连接检查(Oracle示例)[^3] check_database(){ echo -e "\n[数据库检查]" | tee -a $REPORT_FILE DB_CONN="sqlplus -s sys/password@TNS as sysdba" # 表空间使用率检查 $DB_CONN <<EOF | tee -a $REPORT_FILE SET PAGESIZE 0 SELECT &#39;表空间使用率: &#39;||tablespace_name||&#39; → &#39;||used_percent||&#39;%&#39; FROM dba_tablespace_usage_metrics WHERE used_percent > 80; EOF # 连接会话数检查 sessions=$($DB_CONN <<< "SELECT COUNT(*) FROM v\$session;" | awk &#39;/^[0-9]+$/ {print $1}&#39;) echo "当前会话数: $sessions" | tee -a $REPORT_FILE } # 函数:业务日志分析 check_logs(){ echo -e "\n[日志检查]" | tee -a $REPORT_FILE LOG_FILE="/app/logs/app.log" # 检查最近1小时ERROR日志 error_count=$(grep -c &#39;ERROR&#39; $LOG_FILE) if [ $error_count -gt 0 ]; then echo -e "${RED}发现 $error_count 条错误日志${NC}" | tee -a $REPORT_FILE grep &#39;ERROR&#39; $LOG_FILE | tail -n 3 >> $REPORT_FILE else echo -e "${GREEN}未发现错误日志${NC}" | tee -a $REPORT_FILE fi } # 主程序 check_system check_services check_database check_logs echo -e "\n===== 巡检完成 =====" >> $REPORT_FILE ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

运维螺丝钉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值