基于网传的shell脚本,进行简单优化

近日看到网上流传的脚本集合,看了一下,写的都非常好。不过个人感觉有几个例子写的有点啰嗦,所以做了一点优化,算抛砖引玉吧,一起探讨交流,部分脚本如下:

第一题,文本格式化:

请把下面的字符串:

zhangsan
y97JbzPru
lisi
5JhvCls6q
xiaowang
Nnr8qt2Ma
laoma
iqMtvC02y
zhaosi
9fxrb4sJD

改为如下:

zhangsan:y97JbzPru
lisi:5JhvCls6q
xiaowang:Nnr8qt2Ma
laoma:iqMtvC02y
zhaosi:9fxrb4sJD

原参考答案:

#!/bin/bash
#这个脚本用来格式化文本
#作者:****
#日期:2018-12-19

n=`wc -l test3.txt|awk '{print $1}'`
n2=$[$n/2]

for i in `seq 1 $n2`
do
    i2=$[$i*2]
    j=$[$i2-1]
    l1=`sed -n "$i2"p test3.txt`
    l2=`sed -n "$j"p test3.txt`
    echo $l2:$l1
done

优化后:

[root@localhost ~]# sed  'N;s/\n/:/' test
zhangsan:y97JbzPru
lisi:5JhvCls6q
xiaowang:Nnr8qt2Ma
laoma:iqMtvC02y
zhaosi:9fxrb4sJD
第二题,批量修改文件名:

至少用两种方法,批量把当前目录下面所有文件名后缀为.bak的后缀去掉,比如1.txt.bak去掉后为1.txt

原参考答案:

#!/bin/bash
#这个脚本用来去掉文件名后缀
#作者:***
#日期:2018-12-14

for f in `ls -d  ./*.bak `
do
#    mv $f  `echo $f|sed 's/.bak$//'`
    f1=`echo $f|awk -F '.bak$' '{print $1}' `
    mv $f $f1
done

优化后:

[root@localhost ~]# ll
总用量 0
-rw-r--r-- 1 root root 0 6月  26 11:29 1.txt.bak
-rw-r--r-- 1 root root 0 6月  26 11:29 2.txt.bak
-rw-r--r-- 1 root root 0 6月  26 11:29 3.txt.bak
-rw-r--r-- 1 root root 0 6月  26 11:29 4.txt.bak
-rw-r--r-- 1 root root 0 6月  26 11:29 5.txt.bak
-rw-r--r-- 1 root root 0 6月  26 11:29 6.txt.bak
-rw-r--r-- 1 root root 0 6月  26 11:29 7.txt.bak
-rw-r--r-- 1 root root 0 6月  26 11:29 8.txt.bak
-rw-r--r-- 1 root root 0 6月  26 11:29 9.txt.bak
[root@localhost ~]# rename .txt.bak .txt  *
[root@localhost ~]# ll
总用量 0
-rw-r--r-- 1 root root 0 6月  26 11:29 1.txt
-rw-r--r-- 1 root root 0 6月  26 11:29 2.txt
-rw-r--r-- 1 root root 0 6月  26 11:29 3.txt
-rw-r--r-- 1 root root 0 6月  26 11:29 4.txt
-rw-r--r-- 1 root root 0 6月  26 11:29 5.txt
-rw-r--r-- 1 root root 0 6月  26 11:29 6.txt
-rw-r--r-- 1 root root 0 6月  26 11:29 7.txt
-rw-r--r-- 1 root root 0 6月  26 11:29 8.txt
-rw-r--r-- 1 root root 0 6月  26 11:29 9.txt
第三题,打印数组:

写一个脚本让用户输入多个城市的名字(可以是中文),要求不少于5个,然后把这些城市存到一个数组里,最后用for循环把它们打印出来。

原参考答案:

#!/bin/bash
#这个脚本用来打印城市名字
#作者:***
#日期:2018-12-12

read -p "输入不少于5个城市的名字,用空格分隔开。" name

n=`echo $name|awk '{print NF}'`

if [ $n -lt 5 ]
then
    echo "请输入至少5个城市的名字."
    exit
fi

city=($name)

for i in `seq 0 $[${#city[@]}-1]`
do
    echo ${city[$i]}
done

优化后:

#!/bin/bash

read -p "输入不少于5个城市的名字,用空格分隔开: " -a  name

n=`echo $name|awk '{print NF}'`

if [ `echo ${#name[@]}` -lt 5 ]
then
    echo "请输入至少5个城市的名字."
    exit
fi

for i in `seq 0 $[${#name[@]}-1]`
do
    echo ${name[$i]}
done

第四题,判断某网站是否宕机:

写一个shell脚本,通过curl -I 返回的状态码来判定所访问的网站是否正常。
比如,当状态码为200时,才算正常。

原参考答案:

#!/bin/bash#这个脚本用来判断一个网址是否正常#作者:*****#日期:2018-11-01url="http://www.jd.com"mail_user=3067986**@qq.comcode=`curl -I $url 2>/tmp/curl.err|head -1|awk '{print $2}'`if [ -z "$code" ]then    python mail.py $mail_user "$url访问异常" "`cat /tmp/curl.err`"    exitelif [ $code != "200" ]then    curl -I $url &> /tmp/curl.log    python mail.py $mail_user "$url访问异常 状态码$code" "`/tmp/curl.log`" fi

优化后:

#!/bin/bashurl="http://www.jd.com"code=`curl -ILs $url |awk '/HTTP/{print $2}'| grep -w "200"`if [ $? -ne 0 ];then        echo "站点异常!"        #如果想发邮件通知:        #echo  "站点:$url 异常,请检查!" | mailx  -s "warning" username@163.comfi
第五题,检查某网站在线的主机:

写一个shell脚本,把192.168.75.0/24网段在线的ip列出来。

原参考答案:

#!/bin/bashfor i in `seq 1 254`do     if ping -c 2 -W 2 192.168.75.$i >/dev/null 2>/dev/null    then	echo "192.168.75.$i 是通的."    else	echo "192.168.75.$i 不通."    fidone

优化后:

fping -ag 192.168.75.0/24 2>/dev/null

获取最新文章更新,以及常用软件,可以关注公众号: 笨办法学linux
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

运维朱工

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

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

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

打赏作者

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

抵扣说明:

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

余额充值