Linux中的shell脚本编写,求10000之内的素数和与查找文件中最长字符串

shell元字符,转义符

在这里插入图片描述
在这里插入图片描述
单引号硬转义符

双引号软"${a}bc"

斜杠\转义符

在这里插入图片描述
软转义符和正常的变量一样,硬转义就直接将内部直接转为符号,\转义是将后面的一位符号转为普通符号

特殊变量

在这里插入图片描述
在这里插入图片描述

输入输出:read、echo

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
读入数组
在这里插入图片描述
以脚本形式读入数组
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

函数

在这里插入图片描述

IF判断语句

在这里插入图片描述

while

在这里插入图片描述

FOR

在这里插入图片描述

case

#!/bin/bash
read num
case $num in
    1)
        echo "1234"
        ;;
    2)
        echo "2345"
        ;;
    3)
        echo "3456"
        ;;
esac

数组操作

在这里插入图片描述
在这里插入图片描述

变量参数展开、字符串展开

在这里插入图片描述
第一二个是用于删文件时,用的变量来代替文件名,这个时候变量可能会在内存中丢失,则采用这种表达就不会误删
在这里插入图片描述

${pate:?error}

path=/home/byl/test/test/
find ${pate:?error} name “*.c” -type f | xargs rm -f

在用上述find命令删除文件时,当找不到路径时就会从当前路径下开始找,则这个时后就会有问题所以要找不到报警
在这里插入图片描述

第三个不仅可以判断变量C是否存在,如果不存在,还会将该命令执行结果置1执行失败,问号后面可以输出执行失败后要打印的信息
在这里插入图片描述
第四个是变量存在输出后面的内容
在这里插入图片描述
第五个可以将变量打印出来
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

用线性筛求10000之内的素数和

在for循环,while循环,if语句中凡是在(())、[[]]、[]、中出现的变量名等同于在C语言中的变量,不需要再加上${}来取变量值,下列程序已经是很好的说明

默认shell中声明的所有变量为全局变量,需要声明局部变量时必须要专门声明
if判断非整数用下面这种操作,关键是bc命令是判断算式表达式
在这里插入图片描述
let表达式
在这里插入图片描述

#!/bin/bash    #一个#号是注释的意思再加一个!号就是调用后面这个程序来
               #执行下面的shell指令
max=10000      #数组长度赋值
prime_count=0  #用来计数出现了多少素数
declare -a prime   #声明一个数组
for (( i=1; i<=${max}; ++i ));do   #将数组内的所有元素初始化为0
    prime[${i}]=0          #这里的${i}可以直接写i
done


declare -a prime_list    #声明一个所有素数的数组
for (( i=2; i <= max; ++i ));do  #逐一列举合数
    if [[  prime[${i}] -eq 0 ]];then  #判断合数的标记位是否时素数
        prime_count=$[prime_count+1]    #shell中的++必须要这样
        prime_list[prime_count]=${i}  #如果是素数将该素数按顺序记录下来
    fi
    for (( j=1;j <=prime_count ; ++j ));do #列举素数
        if [[ prime_list[j]*i -gt max ]];then #判断素数与合数的乘积是否超过了范围
            break
        fi
        count=$[prime_list[j]*i] #将乘积标记为合数
        prime[${count}]=1
        if [[ i%prime_list[j] -eq 0 ]];then #判断该素数是否是合数的最小素数,如果是就不用再往下循环了
            break
        fi
    done
done
sum=0
for (( x=1;x <= prime_count; ++x ));do
    sum=$[sum+prime_list[x]]
       
    
done

echo ${sum}

详解线性筛

查找最长字符串

在这里插入图片描述

#!/bin/bash


function _seekmoststr_() {
for each1 in `ls -A $1`;do
    #echo ${each1}
    if [[ -f ${each1} ]];then #-f判断该文件是否是普通文件
        file ${each1} | grep -q  "ASCII text" #查看该文件是否是ASCII文件
        if [[ $? -eq 0 ]];then  
            eval `cat ${each1} | tr -s -c 'a-zA_Z' '\n' | awk '{t=length($1);if(t>l){l=t; s=$1}} END{printf("s=%s\nl=%d",s,l)}'`  
            #找到最长字符串s和长度l,并赋值给shell环境中的全局变量s和l
            ln=`grep -n ${s} ${each1} | cut -d : -f 1 | head -n 1`    
            #找到最长字符串所在的行号,并赋值给shell环境中的全局变量ln
            awk -v path1=`pwd` -v name=${each1} -v s=${s} -v l=${l} -v ln=${ln} 'BEGIN{ printf("%s/%s:%d:%s:%s\n",path1,name,l,s,ln)  } ' >> /home/byl/test.out
            #按照要求的格式将路径,长度,字符串,行号打印出来
        fi
        
    elif [[ -d ${each1} ]];then
            cd ${each1}
            eachpath1=`pwd`
            _seekmoststr_ ${eachpath1}
            cd ..
    fi
done    
}

#echo $0
#echo $#
currentpath=`pwd`
if [[ ! $# -eq 0  ]];then
    for each in $@;do
        if [[ -f ${each} ]];then
           # echo "0 file"
            _seekmoststr_ ${each}
        elif [[ -d ${each} ]];then
            cd ${each}
            eachpath=`pwd`
            #echo ${each}
            _seekmoststr_ ${eachpath}
            cd ${currentpath}
        fi
    done
else
    _seekmoststr_ .  #不传参时默认为当前目录
fi
#cat /home/byl/test.out
path2=`cat /home/byl/test.out | awk -F : '{t=$2;if(t>l){l=t; pat=$1; s=$3; ln=$4 }} END{printf("s=%s:%d:%s:%d",pat,l,s,ln)}' | cut -d / -f 4-`
echo ./${path2}
rm /home/byl/test.out
touch /home/byl/test.out

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值