每日一shell脚本

2019.4.25

按单词出现频率降序排序!

    #!/bin/bash
#读取文件,统计文件中单词频率和字符频率

if [[ $# -ne 1 ]];then
        echo "please input one correct param"
        exit
fi

tr ',.?' ' ' <$1 |xargs -n 1|sort|uniq -c|sort -rn
#tr  用来替换,该例中将,.?替换为空格
#<$1 <是输入重定向符,就是将s1的内容作为标准输入重定向到tr;“linux中,没启动一个命令,就会打开三个文件:stdin、stdout、stderr,默认是输出到这三个文件的,当我们有特殊需求时就可以进行所谓的重新定向”
#以上两步最终将文件中的字符?.,替换为空格,方便我们后续对纯单词的操作

#xargs -n 1 参数转换,将标准输入转换为命令行参数,-n是限定参数个数,我们需要统计每个单词的频率,所以使用-n 1  限定每次传递1个
#sort   排序,这里的排序是为了后面的uniq,默认是空格作为界定符,如需指定加参数-t
#uniq -c 去重展示并且带参数-c  是统计每个单词重复的次数
#sort -rn  按照统计次数排序,默认升序,带-r是逆序,带-n是按数值排序,而不是按字符串排;不带-k参数,默认排第一列

======================
将4.24号题中结果文件名中的suning字符串全部改成shenyuqiang(最好用for循环实现),并且将扩展名html全部改成大写

#!/bin/bash
basepath=$(cd `dirname $0`;pwd)#获取脚本当前所在的目录

cd $basepath

for i in `ls *html`
do
        name=`echo $i|cut -c 1-10`
        echo $name
        mv $name"_suning.html" $name"_shenyuqiang.HTML"
done

样例运行结果展示:在这里插入图片描述

===============
关键字:判断字符串长度
利用bash for循环打印下面这句话中字母数不大于6的单词
I am oldboy teacher welcome to oldboy trainingclass

   #!/bin/bash
    
    var="I am oldboy teacher welcome to oldboy trainingclass"
    
    for i in $var
    do
    
            if [ ${#i} -le 6 ];then #${#i} 判断字符串长度
                    echo $i
            fi
    done

样例运行结果展示:在这里插入图片描述

2019.4.24

用户输入参数N,创建N个html文件,文件名包含10个随机数字字母,并以_suning结尾,如shenchen55_suning.html
关键字:正则、$RANDOM、cut -c、tr

#!/bin/bash

if [[ ! $1 =~ ^[1-9][0-9]*$ ]] || [[ $# -ne 1 ]];then  #我只需要1个参数,判断$#是否ne 1;然后判断这个参数是不是大于0的纯数字。使用正则 ^表示起始匹配位;$表示结尾匹配位;
                                                #*表示前面的表达式匹配0次或者多次,注意这里不能用+,因为10以内的数字我们是不需要匹配十位数的;=~用来判断变量是否匹配正则
        echo "参数错误,请检查"
        exit
fi

basepath=$(cd `dirname $0`;pwd)  #该行没用 练手的

for i in `seq 1 $1`
do
touch `echo $RANDOM|md5sum|cut -c 1-10|tr 'a-z' 'A-Z'`_suning.html  #这里在写时,我将它作为变量报错,就直接放到touch后了;cut -c表示根据字符区间来取;tr是‘翻译’的简写,作用是替换
done

样例运行结果展示:
在这里插入图片描述

2019.4.23

求1-100的和
关键字:两种for循环方式、变量相加、函数

#!/bin/bash

function sum(){
sum=0
#for((i=1;i<=100;i++))
for i in `seq 1 100`
do
        sum=$[$sum+$i]   #变量相加或者变量加某个常量的格式要记清  用中括号
done
echo $sum
}
sum			#函数调用不加()

#输入一个数字n并计算1到这个数的总和。要求:如果这个数小于等于1,要求重新输入,直到输入大于1的数字为止;
关键字:if中多个条件判断、函数中for循环变量限制$1 $2…

#!/bin/bash
#输入一个数字n并计算1到这个数的总和。要求:如果这个数小于等于1,要求重新输入,直到输入大于1的数字为止;
if [ $# -ne 1 -o $1 -le 1 ];then  #-o 或;  -a 与;  -le 小于等于
        echo "please input again"
        exit
fi
var=$1

function sum(){
        sum=0
      # for((i=1;i<=$var;i++)) #此处注意 使用函数时,for循环中变量不能直接使用$1 $2...  需提前进行定义,如var=$1;不使用函数无此限制
        for i in `seq 1 $var`   #该命令同样,不能直接使用$1 $2...
        do
                sum=$[$sum+$i]
        done
echo $sum
}

sum

样例运行结果展示:
在这里插入图片描述

#输入一个数字n并计算1到这个数的总和。要求:如果这个数小于等于1,要求重新输入,直到输入大于1的数字为止;
关键字:if/while多个判断条件的写法

#!/bin/bash

function sum3(){
read -p "please input one  number : " num

while [[ $num == *[!0-9]* ]] || [[ $num -le 1 ]]        #if或者while判断多个条件时 可以使用-o -a o指or,a指and,例如 if [ a -gt b -a a -lt c ]:a大于b且a小于c
                                                        #也可以使用|| &&,注意要使用两个单独的中括号[[]],例如该脚本所写
do
        read -p "输入的不是数字或者数字小于1,请重新输入: " num
done

sum=0

for i in `seq 1 $num`
do
        sum=$[$sum+$i]
done

echo "1到$num的和是:"$sum
}

sum3

样例运行结果展示:
在这里插入图片描述

2019.4.22

批量ping主机连通性

!/bin/bash

if [ $# -ne 3 ];then
        echo"必须输入三个参数:./ping.sh 10.37.2 144 190"
        exit
fi

for((i=$2;i<=$3;i++))     #此处可以使用该命令代替   for i in `seq $2 $3`
do
        echo $i
        ping -c 2 $1"."$i &> /dev/null   #  ping -c 2 代表向目标主机发送2个测试包 ; &>/dev/null  类似于垃圾箱,将命令输出重定向到垃圾箱中
        if [ $? = 0 ];then
                echo "ping $1"."$i success"
        else
                echo -e "ping $1"."$i \033[31m failed \033[0m" # 该命令将failed处字体变为红色   \033[31m failed \033[0m
        fi
done

样例运行结果展示:
在这里插入图片描述

2019.4.19

遍历某个文件中的所有行并打印

#!/bin/bash

txtName=$1 #变量定义时注意不要带空格;$符后面加数字 表示执行脚本时需传入几个参数

if [ $# -ne 1 ];then    #if[]要注意带空格,$#指输入参数总数,-ne表示不等于
        echo "缺失参数"
        exit
fi

number=`wc -l $txtName | awk '{print $1}'`      #wc -l会返回两列值  该命令取第一列,其将命令赋给变量,需使用反引号``

for((i=1;i<=$number;i++))
do
        #echo $i
        p=`sed -n $i'p' $txtName` #变量与常量拼接时,注意将常量进行字符化;sed -n 1p txtname   该命令取指定文件的第几行
#       if [ ! -n "$p" ];then    #! -n "变量"    判断变量是空
#       if  test -z "$p";then   #也是判断变量是否为空,但是注意这种方式if不加[]
#               echo "第$i行,该行为空"
#        else
#               echo $p 

        if test -n "$p";then #test -n   :字符串的长度不为零则为真
                echo $p
        else
                echo "第$i行,该行为空"
        fi
done

样例运行结果展示:在这里插入图片描述

===使用while read实现

#/bin/bash

if [ $# -ne 1 ];then
        echo "缺失参数"
        exit
fi

txtName=$1
lineNum=1
cat $txtName | while read line
do
        echo 第$lineNum行:$line
        lineNum=$[$lineNum+1]
done

样例运行结果展示:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

空城雀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值