试题一

  1. 判断所给目录内哪些二级目录下有没有text.txt文件。
  2. 有text.txt文件的二级目录,计算出该test.txt文件里面所给出单词的次数。
  3. 假如脚本名字为1.sh, 运行脚本的格式为 ./1.sh 123 root,其中123为目录名字,而root为要计算数量的单词。
#!/bin/bash

if [ # -ne 2 ]; then
    echo "请提供两个参数,第一个参数是目录名字,第二个参数是单词"
    exit 5
fi

base_cmd=`pwd`
base_dir=1
word=root
sum_count=0

find  base_dir -maxdepth 2 -mindepth 2 -name "text.txt" -type f|while read line
do
    word_wc=`grep -ow "word" line |wc -l`
    sum_count=[sum_count+word_wc]
    echo lineword_wc
done

试题二

交互式脚本,根据提示,需要用户输入一个数字作为参数,最终打印出一个正方形。在这里我提供一个linux下面的特殊字符■,可以直接打印出来。

示例: 如果用户输入数字为5,则最终显示的效果为

#!/bin/bash

if [ # -ne 1 ]; then
    exit 4
fi

for x in `seq 11`
do
    for((y=1;y<=1;y++))
    #for y in `seq 11`
    do
        echo -n "■ "
    done
    echo  
done

试题三

写一个脚本,依次向/etc/passwd中的每个用户问好,并且说出对方的ID是什么,如:

Hello, root,your UID is 0.

awk -F ':' '{print "Hello,"1",your UID is "3"."}' /etc/passwd

试题四

linux系统 /home目录下有一个文件test.xml,内容如下:

<configuration>
    <artifactItems>
        <artifactItem>
       <groupId>zzz</groupId>
       <artifactId>aaa</artifactId>
    </artifactItem>
    <artifactItem>
       <groupId>xxx</groupId>
       <artifactId>yyy</artifactId>
    </artifactItem>
    <!-- </artifactItem><groupId>some groupId</groupId>
       <version>1.0.1.2.333.555</version> </artifactItem>-->
    </artifactItems>
</configuration>

请写出shell脚本删除文件中的注释部分内容,获取文件中所有artifactItem的内容,并用如下格式逐行输出: artifactItem:groupId:artifactId:aaa

#!/bin/bash
#这个脚本用来格式化xml文件
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-11

sed '/<!--.*-->/d' test.xml > test2.xml
egrep -n '<!--|\-\->' test2.xml |awk -F ':' '{print 1}'>/tmp/line_number1.txt
n=`wc -l /tmp/line_number1.txt|awk '{print1}'`
n1=[n/2]
for i in `seq 1 n1`
do
    j=[i*2]
    k=[j-1]
    x=`sed -n "k"p /tmp/line_number1.txt`
    y=`sed -n "j"p /tmp/line_number1.txt`
    sed -i "x,y"d test2.xml
done

grep -n 'artifactItem>' test2.xml |awk '{print1}' |sed 's/://' > /tmp/line_number2.txt
n2=`wc -l /tmp/line_number2.txt|awk '{print 1}'`

get_value(){
    sed -n "1,2"p test2.xml|awk -F '<' '{print2}'|awk -F '>' '{print 1,2}' > /tmp/value.txt

    cat /tmp/value.txt|while read line
    do
        x=`echo line|awk '{print1}'`
        y=`echo line|awk '{print2}'`
        echo artifactItem:x:y
    done
}

n3=[n2/2]
for j in `seq 1 n3`
do
    m1=[j*2-1]
    m2=[j*2]
    nu1=`sed -n "m1"p /tmp/line_number2.txt`
    nu2=`sed -n "m2"p /tmp/line_number2.txt`
    nu3=[nu1+1]
    nu4=[nu2-1]
    get_valuenu3 $nu4
done

#需求不清不楚

试题五

请撰写一个shell函数,函数名为 f_judge,实现以下功能

  1. 当/home/log目录存在时将/home目录下所有tmp开头的文件或目录移到/home/log目录。
  2. 当/home/log目录不存在时,创建该目录,然后退出。
#!/bin/bash

function mv_dir() {
   [ ! -d /home/log ] && mkdir /home/log
   find /home -name "tmp*" |while read line
   do
       mv $line /home/log/
   done
}

mv_dir

试题六

linux系统中,目录/root/下有一个文件ip-pwd.ini,内容如下:

10.111.11.1,root,xyxyxy
10.111.11.2,root,xzxzxz
10.111.11.3,root,123456
10.111.11.4,root,xxxxxx
……

文件中每一行的格式都为linux服务器的ip,root用户名,root密码,请用一个shell批量将这些服务器中的所有tomcat进程kill掉。

#!/bin/bash
#这个脚本用来批量杀tomcat进程
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-12

cat > kill_tomcat.expect <<EOF
#!/usr/bin/expect
set passwd [lindex \argv 0]
set host [lindex \$argv 1]
spawn ssh root@\$host

expect {
    "yes/no" { send "yes\r"; exp_continue}
    "password:" { send "\$passwd\r" }
}

expect "]*"
send "killall java\r"
expect "]*"
send "exit\r"
EOF

chmod a+x kill_tomcat.expect

cat ip-pwd.ini|while read line
do
    ip=`echoline |awk -F ',' '{print 1}'`
    pw=`echoline |awk -F ',' '{print 3}'`
    ./kill_tomcat.expectpw $ip
done

#自己没写,太难弄环境了

试题七

写一个脚本查找/data/log目录下,创建时间是3天前,后缀是*.log的文件,打包后发送至192.168.1.2服务上的/data/log下,并删除原始.log文件,仅保留打包后的文件。

#!/bin/bash
#这个脚本用来查找老日志打包
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-12

cd /data/log
find . -type f -name "*.log" -mtime +3 > /tmp/old_log
d=`date +%F`

tar czf d.tar.gz `cat /tmp/old_log|xargs`
rsync -ad.tar.gz 192.168.1.2:/data/log/
cat /tmp/old_log|xargs rm

#备注:自己没写

试题八

有如下文本,其中前5行内容为

1111111:13443253456
2222222:13211222122
1111111:13643543544
3333333:12341243123
2222222:12123123123

用shell脚本处理后,按下面格式输出:

[1111111]
13443253456
13643543544
[2222222]
13211222122
12123123123
[3333333]
12341243123
#!/bin/bash

for w in `awk -F':' '{print 1}' 3.txt|sort |uniq`
do
    echo -e "[w]"
    awk -v w2=w -F ':' '1==w2 {print $2}' 3.txt
done

试题九

要求:两类机器一共300多台,写个脚本自动清理这两类机器里面的日志文件。在堡垒机批量发布,也要批量发布到crontab里面。

A类机器日志存放路径很统一,B类机器日志存放路径需要用匹配(因为这个目录里除了日志外,还有其他文件,不能删除。匹配的时候可用.log)

A类:/opt/cloud/log/ 删除7天前的 B类: /opt/cloud/instances/ 删除15天前的

要求写在一个脚本里面。不用考虑堡垒机上的操作,只需要写出shell脚本。

#!/bin/bash
#这个脚本用来删除老日志
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-12

dir1=/opt/cloud/log/
dir2=/opt/cloud/instance/

if [ -d dir1 ]
then
    finddir1 -type f -mtime +7 |xargs rm
elif [ -d dir2 ]
then
    finddir2 -name "*.log" -type f -mtime +15 |xargs rm
fi 

试题十

贷款有两种还款的方式:等额本金法和等额本息法,简单说明一下等额本息法与等额本金法的主要区别:

等额本息法的特点是:每月的还款额相同,在月供中“本金与利息”的分配比例中,前半段时期所还的利息比例大、本金比例小,还款期限过半后逐步转为本金比例大、利息比例小。所支出的总利息比等额本金法多,而且贷款期限越长,利息相差越大。 等额本金法的特点是:每月的还款额不同,它是将贷款额按还款的总月数均分(等额本金),再加上上期剩余本金的月利息,形成一个月还款额,所以等额本金法第一个月的还款额最多 ,而后逐月减少,越还越少。所支出的总利息比等额本息法少。

两种还款方式的比较不是我们今天的讨论范围,我们的任务就是做一个贷款计算器。其中: 等额本息每月还款额的计算公式是: 每月还款额=[贷款本金×月利率×(1+月利率)^还款月数]÷[(1+月利率)^还款月数-1] 等额本金每月还款额的计算公式是: 每月还款额=贷款本金÷贷款期数+(本金-已归还本金累计额)×月利率

#!/bin/bash
#这个脚本用来实现简易的房贷计算器
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-12

read -p "请输入贷款总额(单位:万元):" sum_w
read -p "请输入贷款年利率(如年利率为6.5%,直接输入6.5):" y_r
read -p "请输入贷款年限(单位:年):" y_n
echo "贷款计算方式:"
echo "1)等额本金计算法"
echo "2)等额本息计算法"
read -p "请选择贷款方式(1|2)" type
#贷款总额
sum=`echo "scale=2;sum_w*10000 " | bc -l`
#年利率
y_r2=`echo "scale=6;y_r/100 " | bc -l`
#月利率
m_r=`echo "scale=6;y_r2/12 " | bc -l`
#期数
count=[y_n*12]
echo "期次 本月还款额 本月利息 未还款额"

jin()
{
    #月还款本金m_jin=贷款总额sum/期数count
    m_jin=`echo "scale=2;(sum/count)/1 " | bc -l`
    #定义未还本金r_jin(第一期应该是贷款总额)
    r_jin=sum
    for((i=1;i<=count;i++))
    do
        #本月利息m_xi=剩余本金*月利率
        m_xi=`echo "scale=2;(r_jin*m_r)/1"|bc -l`
        #本月还款m_jinxi=月还本金m_jin+本月利息m_xi
        m_jinxi=`echo "scale=2;(m_jin+m_xi)/1"|bc -l`
        #已还款本金jin=月还本金m_jin*期数i
        jin=`echo "scale=2;(m_jin*i)/1"|bc -l`
        #剩余本金r_jin=贷款总额sum-已还本金jin
        r_jin=`echo "scale=2;(sum-jin)/1"|bc -l`
        if [i -eq count ]
        then
            #最后一月的还款额应该是每月还款本金+本月利息+剩余本金
            m_jinxi=`echo "scale=2;(m_jin+r_jin+m_xi)/1"|bc -l`
            #最后一月的剩余本金应该是0
            r_jin=0
        fi
        echo "im_jinxi  m_xir_jin"
     done   
}

xi()
{
    #每期还款m_jinxi=(贷款总额sum*月利率m_r*((1+月利率m_r)^期数count))/(((1+月利率m_r)^期数count)-1)
    m_jinxi=`echo "scale=2;((sum*m_r*((1+m_r)^count))/(((1+m_r)^count)-1))/1 " | bc -l`
    #定义未还本金r_jin(第一期应该是贷款总额)
    r_jin=sum
    for((i=1;i<=count;i++))
    do
        #本期利息m_xi=剩余本金r_jin*月利率m_r
        m_xi=`echo "scale=2;( r_jin*m_r)/1"|bc -l`
        #本期本金m_jin=本期本息m_jinxi-本期利息m_xi
        m_jin=`echo "scale=2;(m_jinxi-m_xi)/1 " | bc -l`
        #未还本金r_jin=上期未还本金r_jin-本期应还本金m_jin
        r_jin=`echo "scale=2;(r_jin-m_jin)/1 " | bc -l`
        if [ i -eqcount ]
        then
            #最后一月本息m_jinxi=本期本金m_jin+未还本金r_jin
            m_jinxi=`echo "scale=2;(m_jin+r_jin)/1 " | bc -l`
            #最后一月的剩余本金应该是0
            r_jin="0.00"
        fi
        echo "im_jinxi m_xir_jin"
    done
}

case $type in
    1) 
        jin
        ;;
    2) 
    xi
        ;;
    *) 
    exit 1
        ;;
esac
最后修改日期: 2020年8月28日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。