小编科普一下19个Shell脚本

1.判断/tmp/run目录是否存在,如果不存在就建立,如果存在就删除目录里所有文件
#!/bin/bashdir=/tmp/run[ -f $dir ] && mv $dir $dir.bak[  -d $dir ] && rm -rf $dir/* || mkdir $dir  
2.输入一个文件的绝对路径,判断路径是否存在,而且输出是文件还是目录,如果是字符连接,还得输出是有效的连接还是无效的连接
#!/bin/bashread -p input a path: pathif [ -l $path -a -e $path ];then echo this is effective linkelif [ -l $path -a ! -e $path ];then echo this is not effective linkelif [ -d $path ];then echo this is a directorelif [ -f $path ];then echo this is fileelif [ -e $path ];then echo this is a other type fileelse echo the file is not existfi  
3.交互模式要求输入一个ip,然后脚本判断这个ip 对应的主机是否 能ping 通,输出结果类似于:
server  10.1.1.20 is down! 最后要求把结果邮件到本地管理员root@localhost和mail01@localhost  
方法一:
#!/bin/bashread -p 输入ip地址: ipping -c 2 $ip  > /dev/null 2>&1if [ $? -eq 0 ];then  echo server $ip is ok.  |mail -s 'check server' root@localhostelse  echo server $ip is down! |mail -s 'check server' root@localhostfi  
方法二:
#!/bin/bashread -p input your ip: ipping -c 1 $ip &>/dev/null[ $? -eq 0 ] && echo server $ip is ok|mail -s check server root@localhost || echo server $ip is down |mail -s check server root@localhost  
方法三:
#!/bin/bashtmpfile=`mktemp`mailaddr=root@localhost mail@localhostread -p 输入ip地址: ipping -c 2 $ip  > /dev/null 2>&1if [ $? -eq 0 ];then    echo server $ip is up!  >> $tmpfileelse    echo server $ip is down! >> $tmpfilefi cat $tmpfilemail -s ping server $mailaddr /dev/nullretval=$?if [ $retval -eq  0 ];then echo server $ip is up > $tmpfileelse echo server $ip is down > $tmpfileficat $tmpfilemail -s ping result $rootmail /tmp/ip_ok>/tmp/ip_downip=10.1.1#循环去ping局域网内的主机for ((i=1;i/dev/nulltest $? -eq 0 && echo $ip.$i |tee -a /tmp/ip_ok || echo $ip.$i |tee -a /tmp/ip_downdone思考:以上方法可以实现,但是速度很慢,希望并行执行#!/bin/bash#清空原来ip文件里的列表>/tmp/ip_ok>/tmp/ip_downip=10.1.1#循环去ping局域网内的主机for ((i=1;i/dev/nulltest $? -eq 0 && echo $ip.$i |tee -a /tmp/ip_ok || echo $ip.$i |tee -a /tmp/ip_down}&donewaitecho ip is ok...  
5.写一个脚本/home/hello.sh,要求当给脚本输入参数hello时,脚本返回world,给脚本输入参数world时,脚本返回hello。而脚本没有参数或者参数错误时,屏幕上输出“usage:/home/hello.sh hello or world”
#!/bin/bash#read -p input a string: aif [  $# -eq 0 -o $# -gt 1 ];then        echo usage:/home/program/test4.sh world|hello        # echo usage:`basename $0` world|hello # 更常用的报错写法elif [ $1 = hello ];then        echo worldelif [ $1 = world ];then        echo helloelse        echo usage:/home/program/test4.sh world|hellofi  
6.自动搭建nfs服务
#!/bin/bash#关闭防火墙和selinuxservice iptables stopchkconfig iptables offsetenforce 0 &>/dev/nullecho ########防火墙和selinux已经关闭#########测试网络,配置内网yum源ping -c 1 192.168.1.10 &>/dev/nullif [ $? -eq 0 ];then    echo ########网络ok########else   echo ########请检查你的网络########   exitfiwget -p /etc/yum.repos.d/ ftp://192.168.1.10/demo.repo &>/dev/null#安装相关软件yum -y install 'nfs*' rpcbind &> /dev/null && echo ########软件安装ok########发布共享目录并授权read -p input your share dir: dir[ ! -d $dir ] && mkdir $dir -p #授权chmod 1777 $dirread -p input your share host(192.168.0.0/24(ro)): hostcat >> /etc/exports /dev/null && echo ############nfs服务启动成功#############chkconfig rpcbind onchkconfig nfs on#测试验证mkdir /u01 &>/dev/nullmount.nfs  localhost:$dir /u01[ $? -eq 0 ] && echo nfs服务测试ok,可以正常使用!umount /u01  
7.将/etc/passwd里的用户名分类,分为管理员用户,系统用户,普通用户。
分析:1. 根据用户的uid来判断用户种类2.用户的信息保存在/etc/passwd文件中,需要在该文件中获取uid3.根据用户的uid去判断管理员:root 0系统用户:1-499 ftp apache ...  65534 nfsnobody普通用户:500-60000#!/bin/bashfor i in `cat /etc/passwd|cut -d: -f1,3` do  uid=`echo $i |cut -d: -f2`  name=`echo $i |cut -d: -f1`  [ $uid -eq 0 ] && echo $name >>/tmp/adminuser  [ $uid -gt 0 -a $uid -lt 500 -o $uid -eq 65534 ] && echo $name >>/tmp/systemuser  [ $uid -ge 500 -a $uid -ne 65534 ] && echo $name >>/tmp/normaluser done  
8.写一个倒计时脚本,要求显示离2018年1月1日(元旦节)的凌晨0点,还有多少天,多少时,多少分,多少秒。
分析:1. 该脚本应该是一个死循环,除非当前系统时间等于1月1日的凌晨0点,要退出循环,并且打印元旦快乐  break2. 计算未来时间(1月1日的凌晨0点)和当前系统时间的时间差     时间单位相同并且以相同的时间为一个基准  需要定义2个变量:现在时间和未来时间date命令 -d  %s3. 计算假如1月1日和现在时间相差100000s1天=86400s1小时=3600s1分钟=60$[  100000/86400  ]=天$[ $[100000%86400] /3600   ]=小时$[   $[ 100000%3600] /60     ]=分钟#!/bin/bashgoal=`date +%s -d 20181001`while true 或者until falsedo         now=`date +%s` if [ $[$goal-$now] -eq 0 ];then  break fi        day=$[($goal-$now)/86400]        hour=$[($goal-$now)%86400/3600]        minute=$[($goal-$now)%3600/60]        second=$[($goal-$now)%60] clear        echo 离2018年1月1日还有$day天:$hour时:$minute分:$second秒        sleep 1doneecho 元旦节快乐!!!  
9.写一个脚本把一个目录内的所有空文件都删除,最后输出删除的文件的个数。
分析:1. 如何判断文件是空文件  -s 判断文件内容为非空;判断空文件则 ! -s    eg:[ ! -s file ]2. 定义一个变量count=0来保存删除文件的个数,掌握四则运算  let count++3. 交互式定义变量让用户自己决定清理哪个目录  /data/logs/   10个文件  循环次数由目录里的文件个数决定 find命令#!/bin/bashread -p 输入一个你要删除空文件的目录: dircount=0for i in `find $dir -type f`do [ ! -s $i ] && rm -rf $i && let count++     ##-s表示非空doneecho 删除的个数为: $count   
10.写一个脚本,将跳板机上yunwei用户的公钥推送到局域网内可以ping通的所有机器上 10.1.1.1~10.1.1.254
分析:环境:jumper-server 有yunwei用户app1-appn  局域网内所有可以ping通的机器1. 在跳板上创建yunwei用户,并且生成一对秘钥2. 检测当前局域网中哪些ip是能ping通哪些是不能ping通  循环语句并发的去检查3. 在脚本中所有的交互动作需要用到expect实现yunwei用户sudo授权:visudo## allow root to run any commands anywhereroot    all=(all)       allyunwei  all=(root)      nopasswd:all,!/sbin/shutdown,!/sbin/init,!/bin/rm -rf /#!/bin/bash#检查局域网中哪些ip是可以ping通,并保存到一个文件ip1=10.1.1for ((i=1;i/dev/null      [ $? -eq 0 ] && echo $ip1.$i >> ip_up.txt }&donewait#yunwei用户生成一对秘钥(有交互)[ ! -f ~/.ssh/id_rsa ] && ssh-keygen -p '' -f ~/.ssh/id_rsa#将yunwe用户的公钥远程拷贝到指定的服务器 100 循环##判断expect程序是否安装{rpm -q expect[ $? -ne 0 ] && sudo yum -y install expectwhile read ip2do /usr/bin/expect< ip_up.txtfor i in {2..10}do { ip=10.1.1.$i ping -c1 $ip &>/dev/null [ $? -eq 0 ] && echo $ip |tee -a ip_up.txt }&   //并行放到后台运行donewait   //等待进程结束#将yunwei用户目录下的公钥推送到可以ping的服务器上#1. 判断yunwei用户下有没有公钥[ ! -f ~/.ssh/id_rsa.pub ] && ssh-keygen -p  -f ~/.ssh/id_rsa#2.将id_rsa.pub公钥远程推送到指定服务器#2.1 判断expect程序是否安装,没安装则安装它{rpm -q expect[ $? -ne 0 ] && sudo yum -y install expectfor remote_ip in `cat ip_up.txt`do /usr/bin/expect >ip_up.txt        /usr/bin/expect <<-eof        spawn ssh-copy-id root@$ip        expect {        yes/no { send yes;exp_continue }        password: { send 123456 }        }        expect eof        eofdone#测试验证test_ip=`tail -1 ip_up.txt`ssh root@$test_ip hostnametest $? -eq 0 && echo 公钥推送成功。  
11.
任务/背景:
现有的跳板机虽然实现了统一入口来访问生产服务器,yunwei用户权限太大可以操作跳板机上的所有目录文件,存在数据被误删的安全隐患,所以希望你做一些安全策略来保证跳板机的正常使用。
具体要求:
只允许yunwei用户通过跳板机远程连接后台的应用服务器做一些维护操作
公司运维人员远程通过yunwei用户连接跳板机时,跳出以下菜单供选择:
欢迎使用jumper-server,请选择你要操作的主机:    1. db1-master    2. db2-slave    3. web1    4. web2    q. exit  
当用户选择相应主机后,直接免密码登录成功
如果用户不输入一直提示用户输入,直到用户选择退出
思路:
需要当yunwei用户登录时执行一个脚本(该脚本放到哪里?)yunwei用户的家目录里的.bashrc
脚本中需要打印一个菜单供用户选择(case…esac)
免密码登录(上面第10个脚本推公钥的脚本)
#!/bin/bash#公钥推送成功trap '' 1 2 3 19#打印菜单用户选择menu(){cat <<-eof欢迎使用jumper-server,请选择你要操作的主机:1. db1-master2. db2-slave3. web14. web2h. helpq. exiteof}#调用函数来打印菜单menuwhile truedoread -p 请输入你要选择的主机[h for help]: host#通过case语句来匹配用户所输入的主机case $host in 1|db1) ssh root@10.1.1.1 ;; 2|db2) ssh root@10.1.1.2 ;; 3|web1) ssh root@10.1.1.250 ;; h|help) clear;menu ;; q|quit) exit ;;esacdone#!/bin/bash#jumper-server#菜单打印trap '' 1 2 3 while truedocat <>/etc/hosts/dev/null#发布虚拟主机cat>>/etc/httpd/conf/httpd.conf 14.需求:写一个脚本让用户输入基本信息(姓名,性别,年龄),如不输入一直提示输入,最后根据用户的信息输出相对应的内容
思路:
循环直到输入字符串不为空 -z -n
根据用户输入信息做出匹配判断
#!/bin/bash#该函数实现用户如果不输入内容则一直循环直到用户输入为止,并且将用户输入的内容打印出来input_fun(){  input_var=  output_var=$1  while [ -z $input_var ] do read -p $output_var input_var done echo $input_var}或者fun(){read -p 请输入您的姓名: nameif [ -z $name ];thenfunelseecho 你好,$name!fi}fun#调用函数并且获取用户的姓名、性别、年龄分别赋值给name、sex、age变量name=$(input_fun 请输入你的姓名:)sex=$(input_fun 请输入你的性别:)age=$(input_fun 请输入你的年龄:)#根据用户输入的性别进行匹配判断#根据用户所输入的内容进行判断输入case $sex in man|男) if [ $age -ge 18 -a $age -le 25 ];then  echo 哥们,娶媳妇了吗 elif [ $age -gt 25 -a $age -le 35 ];then  echo 要担起家庭的责任 elif [ $age -lt 18 ];then  echo 小伙子不错 else  echo $name先生,你油腻了吗? fi ;; woman|女) echo $name 小姐姐你好漂亮 ;; *) echo 你是泰国来的吗? ;;esac  
15.写一个初始化系统的脚本
1)自动修改主机名(如:ip是192.168.0.88,则主机名改为server88.itcast.cc)a. 更改文件非交互式 sed/etc/sysconfig/networkb.将本主机的ip截取出来赋值给一个变量ip;再然后将ip变量里以.分割的最后一位赋值给另一个变量ip12)自动配置可用的yum源3)自动关闭防火墙和selinux#!/bin/baship=`ifconfig eth1|sed -n '2p'|sed 's/.*addr:(.*) bcast.*/1/g'`ip1=`echo $ip|cut -d. -f4`#修改主机名sed -i /hostname=/c hostname=server$ip1.itcast.cc /etc/sysconfig/networkecho $ip       server$ip1.itcast.cc >> /etc/hosts#配置yum源mount /dev/sr0 /mnt/ &> /dev/nullcat > /etc/yum.repos.d/local.repo /dev/null#sed -i '/selinux=/c selinux=disabled' /etc/selinux/config  
16.写一个搭建ftp服务的脚本,要求如下:
1)不支持本地用户登录2) 匿名用户可以上传 新建 删除3) 匿名用户限速500kbps#!/bin/bash#安装软件read -p 请输入需要安装的软件: syum -y install $s &>/dev/null#备份配置文件c=/etc/vsftpd/vsftpd.confcp $c $c.bak#修改配置文件sed -i '/local_enable/c local_enable=no' $csed -i '$a anon_upload_enable=yes' $csed -i '$a anon_mkdir_write_enable=yes' $csed -i '$a anon_other_write_enable=yes' $csed -i '$a anon_max_rate=512000' $c#启动服务service vsftpd restart &>/dev/nullecho 'vsftpd启动成功'#测试验证chmod 777 /var/ftp/pubtouch /var/ftp/pub/1.txtip=`ifconfig eth1|sed -n '2p'|sed 's/.*addr:(.*) bcast.*/1/g'`cd /tmplftp $ip < df.txtuse=`cat df.txt|awk '{print $5}'|grep -o '[0-9]+'`for i in $use  do   [ $i -ge 90 ] && echo notice disk space:`grep $i df.txt` |mail tom donerm -f df.txt  
18.写一个脚本监控系统内存和交换分区使用情况
#!/bin/bashoifs=$ifs  初始化默认分隔符ifs=  定义默认分隔符file=`free -m|sed -nr '/mem|swap/p'|awk '{print $4,$2}'`mem=`echo $file|head -1`swap=`echo $file|tail -1`  echo $mem |awk '{if(($1/$2)*100<=50) print 物理内存空间需要留意,剩余$1m;else print 物理内存在正常范围}'  echo $swap |awk '{if(($1/$2)*100> /tmp/date.txt#取物理内存free值echo mem-free:`free -m | grep mem | awk '{print $4}'`m >> /tmp/mem-free.txt#取缓冲区free值echo buffers/cache-free:`free -m | grep - | awk '{print $4}'`m >> /tmp/buffers-free.txt#取swap区free值echo swap-free:`free -m | grep swap | awk '{print $4}'`m >> /tmp/swap-free.txt#将时间与相关数据重新写入新文件paste /tmp/date.txt /tmp/mem-free.txt /tmp/buffers-free.txt /tmp/swap-free.txt > /tmp/free.txt#发送监控邮件mail -s 内存监控报告 root@localhost /dev/null;then a1=`echo $ip | cut -d. -f1` a2=`echo $ip | cut -d. -f2` a3=`echo $ip | cut -d. -f3` a4=`echo $ip | cut -d. -f4` if [ $a1 -gt 0 -a $a1 -le 255 -a $a2 -le 255 -a $a3 -le 255 -a $a4 -gt 0 -a $a4 -le 255 ];then  echo $ip available! else  echo $ip not available! fielse echo ip format error!fi


一款可快速部署LoRa Basics™ Station并连接到TTS V3的容器
单相无刷直流电机在家电市场上的应用
Mini LED电视有何强大之处—Mini LED电视评测
2018全球生物特征识别大会,共同探讨智能时代生物识别新机遇
650V碳化硅MOSFET扩展了符合AEC-Q101标准的E3M系列
小编科普一下19个Shell脚本
为什么区块链技术也称为分布式分类帐技术
时间短见效快的搪瓷罐腐蚀渗漏治理方法
红米Note4X今日发布 小米首款预售手机
对话柯洁:我喜欢自我挑战,将再战AI围棋
一种采用超弹性模型和赫兹接触模型的柔性压力传感器
小米即将发布新机汇总:小米Note3、小米MIX2、小米6Plus、红米Note5、红米Pro2,你期待吗?
电压致动器优势
小功率开关电源芯片U6117S
利用TMC428控制器和MCS51单片机实现步进电机驱动控制系统的设计
德国人工智能研究中心与IAV联合研发实验室:研发人工智能应用汽车
如何通过检测电源电压确定是否进行了断相保护
正确的电源纹波测试方法介绍
试用手记:为国产FPGA正名(五,外扩SFR使用)
SQL语言艺术