shell脚本基本操作
概述:
Shell是一个命令解释器,它的作用是解释执行用户输入的命令及程序等。 用户每输入一条命令,Shell就执行一条。这种从键盘输入命令,就可以立即得到回应的对话方式,称为交互的方式。
当命令或程序语句不在命令行下执行,而是通过一个程序文件来执行时,该程序文件就被称为Shell脚本
解释:
echo 表示打印 ,, 变量调用语法: $变量名
1.查看tomcat进程并杀掉进程
#!/bin/bash echo "开始查询tomcat运行的进程编号,查出将其kill" dsp_admin_id=`ps -ef|grep tomcat|grep -v "grep" | awk '{print $2}'` echo $dsp_admin_id for id in $dsp_admin_id do kill -9 $id echo "killed $id" done
命令行:
#####查找tomcat进程($2表示下标,可以为其他)
ps -ef | grep tomcat | grep -v grep | awk '{print $2}'
#####查找tomcat进程并杀死
ps -ef | grep tomcat | grep -v grep | awk '{print $2}' | xargs kill -9
2.分支判断
#int类型_变量大小判断 a=10 b=20 if [ $a == $b ] then echo "a 等于 b" elif [ $a -gt $b ] then echo "a 大于 b" elif [ $a -lt $b ] then echo "a 小于 b" else echo "没有符合的条件" fi #字符串判断(adc可以为变量) if [ -n 'abc' ];then echo "字符串长度大于0" elif [ -z 'abc' ];then echo "字符串长度为0" elif [ 'abc' = 'abc' ];then echo "两个字符串相等" elif [ 'abc' != 'abc' ];then echo "两个字符串不相等" fi #____多条件判断____________ a=20 b="dalan_123" #统计字符串长度 echo ${#b} if (( $a > 10 && ${#b} > 20 ));then echo "两个条件同时满足" elif (( $a > 10 || ${#b} > 20 ));then echo "满足一个就执行" else echo "条件不满足" fi #if嵌套 aa=100 if [ $aa -gt 50 ];then echo "$aa 大于50" if (( $aa % 2 == 0 ));then #两种操作方式 echo "$(($aa+120))" echo "$[$aa+120]" echo "$aa %2= $[$aa%2]" fi else echo "$aa 不小于50" fi #从键盘接收数据判并判断 read age if (( $age <= 2 )); then echo "婴儿" elif (( $age >= 3 && $age <= 8 )); then echo "幼儿" elif (( $age >= 9 && $age <= 17 )); then echo "少年" elif (( $age >= 18 && $age <=25 )); then echo "成年" elif (( $age >= 26 && $age <= 40 )); then echo "青年" elif (( $age >= 41 && $age <= 60 )); then echo "中年" else echo "老年" fi #文件比较 if [ -e test.html ];then echo "test.html存在" elif [ -d test.html ];then echo "test.html是目录" elif [ -f test.html ];then echo "test.html存在,并且是一个普通文件" elif [ -c test.txt ];then echo "文件存在特殊字符" elif [ -n test.txt ];then echo "文件为空" else echo "不知道,拜拜" fi #####从键盘输入并判断是否为正整数 #/bin/bash TIMESTAMP=$(date +"%Y%m%d_%H%M%S") echo "当前时间:$TIMESTAMP" read -p "请输入线程数: " threadsnum read -p "请输入循环次数: " cycles if [[ $threadsnum =~ ^[0-9]+$ ]] && [[ $cycles =~ ^[0-9]+$ ]]; then echo "开始处理..............." else echo "输入的不是正整数,程序退出!" fi
3.字符串操作
#!/bin/bash #字符串拼接(连接、合并) name="Shell" url="http://c.biancheng.net/shell/" str1=$name$url #中间不能有空格 str2="$name $url" #如果被双引号包围,那么中间可以有空格 str3=$name": "$url #中间可以出现别的字符串 str4="$name: $url" #这样写也可以 str5="${name}Script: ${url}index.html" #这个时候需要给变量名加上大括号 echo $str1 echo $str2 echo $str3 echo $str4 echo $str5 #统计字符串长度 echo ${#url} #字符串截取 url="www.biancheng://wei.net" #截取3到7位字符串 echo ${url:3:7} #截取第5位后的字符串 echo ${url:5} #休眠5秒(强等待) sleep 5s #截取':'后的数据 echo ${url#*:}
4.循环
#!/bin/bash #___________while循环__________________ read -p "从键盘接收数据:" snum read -p "从键盘接收数据: " enum #while循环 while [[ $snum -le $enum ]];do echo "当前为 $snum" ((snum++)) done echo "执行完成" #死循环 while true do echo "Welcome to Yiibai" done #从1叠加到100的总和 i=1 sum=0 while((i <= 100)) do #echo $i sum=$[sum+i] let i++ done echo $sum #__________for循环___________________ sum=0 for ((i=1; i<=100; i++)) do #循环体 ((sum += i)) done echo "总和为 $sum" #通过in来循环 sum=0 for n in 1 2 3 4 5 6 do echo $n ((sum+=n)) done echo "The sum is "$sum #循环和判断 sum=0 for ((i=1; i<=50; i++)) do if (( $i % 2 == 0 ));then echo $i fi ((sum += i)) done echo "总和为 $sum"
5.其他
#!/bin/bash #判断运行python进程是否大于1 if [ $(ps -ef|grep -c "python3") -gt 1 ] then echo "true" fi #列出当前运行的进程数量 aa=$(ps -ef|grep -c "tomcat") echo "$aa" #列出tomcat在运行的进程信息 aa=$(ps -ef|grep "tomcat") echo "$aa" #两种打印打球路径的方法 echo $(cd $(dirname $0); pwd) echo $path `pwd`
6. shell内调用python脚本
#!/bin/bash a=$(grep -c "验证通过" /home/work/test/index.html) b=20 if [ $a -gt $b ] then echo "$a 条件通过" else echo "条件不通过" #打印当前所在目录 echo $path `pwd` #执行python脚本(不带函数的) python pppp.py fi #!/bin/bash a=$(grep -c "验证通过" /home/work/test/index.html) echo "$a" b=20 if [ $a -gt $b ] then echo "$a 条件通过" else echo "条件不通过" cd /home/work echo $path `pwd` #调用函数(带参数) checkresult=`python -c 'import ppp; print ppp.wei("chenwei_zai_dalan")'` echo $checkresult fi
###############通过shell脚本调用python并传参数############ #/bin/bash TIMESTAMP=$(date +"%Y%m%d_%H%M%S") echo "当前时间:$TIMESTAMP" python3 123.py "参数一" "参数二" """ ########python脚本如下(123.py) #!/usr/bin/env python # -*- coding: utf-8 -*- import os,sys print("00000",sys.argv[0]) print("11111",sys.argv[1]) print("22222",sys.argv[2]) print("==---==all=======") """
7.判断文件是否存在
#!/bin/bash if [ -f file.txt ];then echo "文件存在" else echo "文件不存在" fi
#!/bin/bash TIMESTAMP=$(date +"%Y%m%d_%H%M%S") #获取时间 #判断目录存在且不为空 if [ -d "./report/${TIMESTAMP}" ] && [ -n "$(ls -A "./report/${TIMESTAMP}")" ]; then echo "目录存在且不为空" #把目录递归打包成zip文件 zip -r ./report/${TIMESTAMP}.zip ./report/${TIMESTAMP} else echo -e "\033[31m >>>>>>>目录不存在或目录为空,报告生成失败!>>>>>>\033[0m" fi
8.检测本机当前用户是否为超级管理员
#!/bin/bash # 检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不 # 是,则提示您非管理员(使用字串对比版本) if [ $USER == "root" ] then yum -y install vsftpd else echo "您不是管理员,没有权限安装软件" fi
9.循环检查进程是否存活,死了就重启
main_test.sh:
#!/bin/bash while true # 无限循环 flag=`ps -aux |grep "httpd" |grep -v "grep" |wc -l` do if [[ $flag -eq 0 ]] # 判断进程数如果等于0,则启动httpd then `systemctl start httpd` # 启动httpd echo `date` - "Apache restart" >> running.log # 将重启时间写入自定义的日志文件 else echo "Apache is running..." >> /dev/null fi sleep 30s # 延迟30秒后进入下次循环 done
备注:需要后台启动 nohup ./main_test.sh &
10.函数使用
#!/bin/bash function Add(){ #`-e`:表示解析转义字符。当使用`echo -e`时,`echo`命令会解析转义字符,例如`\n`表示换行,`\t`表示制表符,`\"`和`\'`分别表示双引号和单引号等。 #`echo -n`是`echo`命令的一个选项,它的作用是在输出结束后不换行。 echo -e "\033[31m 输入一个正整数(颜色红色) \033[0m" read x echo -n "再次输入一个正整数" read y
echo -e "e[1;45m 背景紫色 e[0m" echo "Adiition is: $(( x+y ))" } ##调用函数 Add
相关连接:
https://www.cnblogs.com/yinheyi/p/6648242.html ..........................................................shell基础
https://blog.csdn.net/jb19900111/article/details/13507815 ............................................shell案例
https://mp.weixin.qq.com/s/o1AVVrnbmDIkoow9jKL9nA .................................................35个实用的Shell拿来就用脚本实例!
https://mp.weixin.qq.com/s/o63aIM2p9rc2OjhxiC6wgA...........................................shell常用分析
https://www.cnblogs.com/chengJAVA/p/6115061.html ....................................................系统资源情况
https://blog.csdn.net/achenyuan/article/details/78674102 .............................................查看磁盘情况
https://i.cnblogs.com/posts?cateId=1337850.................................................................守护进程