首页 > 技术文章 > shell脚本基本操作

chen-xia 2020-11-02 21:06 原文

 

概述:

Shell是一个命令解释器,它的作用是解释执行用户输入的命令及程序等。 用户每输入一条命令,Shell就执行一条。这种从键盘输入命令,就可以立即得到回应的对话方式,称为交互的方式。

当命令或程序语句不在命令行下执行,而是通过一个程序文件来执行时,该程序文件就被称为Shell脚本

 

 

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

 

 

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

 

 7.判断文件是否存在

#!/bin/bash

if [ -f file.txt ];then
 echo "文件存在"
else 
 echo "文件不存在"
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 &

 

 

 

相关连接:

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.................................................................守护进程

 

推荐阅读