s6.运维经典面试题 (四)

67 阅读13分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

第六章 SHELL脚本编程

1.00、@、*、#、$$、!!、?代表什么含义

$0 获取当前执行的shell脚本的文件名,如果执行脚本带路径那么就包括脚本路径$* 获取当前shell脚本所有传参的参数,将所有的参数视为单个字符串,相当于“$1$2$"...,注意与$#号的区别$# 获取当前执行的shell脚本后面接的参数的总个数$@ 这个程序的所有参数”$1""$2""$3"“…”,这是将参数传递给其他程序的最佳方式,因为他会保留所有嵌在每个参数里的任何空白。"$@""$*",都要加双引号。$$ 获取当前Shell的进程号(PID)$!执行上一个指令的PID$_ 在此之前执行的命令或脚本的最后一个参数$?获取执行的上一个指令的返回值

2. ()和{}区别

#会开启子shell,只在子shell中有效
[root@centos8 ~]# name=raymond;(echo $name;name=tom;echo $name;);echo $name
结果:
raymond
tom
raymond
​
#不会开启子shell,在当前shell中运行
[root@centos8 ~]# name=raymond;{ echo $name;name=tom;echo $name; };echo $name
结果:
raymond
tom
tom

3.| 管道

[root@centos8 /data/script]#exit
Logout
[root@centos8 ~]#echo raymond | read NAME
[root@centos8 ~]#echo $NAME
#这里看不到,因为| 管道会开启子shell进程,这里子shell进程已经结束,在父shell进程里是看不到子shell进程的
​
[root@centos8 ~]#echo raymond | { read NAME; echo $NAME; }
raymond
#要在子shell进程里才可以看到

4.read和输入重定向

[root@centos8 bin]# echo 1 2 >test.txt[root@centos8 bin]# read i j <test.txt ;echo i=$i j=$j
i=1 j=2[root@centos8 bin]# echo 1 2 | read x y ;echo x=$x y=$y
x= y=
[root@centos8 bin]# echo 1 2 | (read x y ;echo x=$x y=$y)
x=1 y=2
[root@centos8 bin]# echo 1 2 | { read x y ;echo x=$x y=$y; }
x=1 y=2

5.exec、source以及bash有什么区别

bash:父进程会fork一个子进程,shell script在子进程中执行,修改的上下文不会影响当前shell

source:在原进程中执行,不会fork子进程,修改的上下文会影响当前shell

exec:在原进程中执行,但是同时会终止原进程

6.计算1+2+3+...+100的结果

[root@centos8 ~]# sum=0;for i in {1..100};do let sum+=i;done ;echo sum=$sum
sum=5050
​
[root@centos8 ~]# vim for_sum.sh 
#!/bin/bash
# 
#********************************************************************
#Author:            zhanghui
#QQ:                19661891
#Date:              2020-11-28
#FileName:         for_sum.sh
#URL:               raymond.blog.csdn.net
#Description:      The test script
#Copyright (C):     2020 All rights reserved
#********************************************************************
sum=0
N=100
for i in `seq $N`;do
    let sum+=i
done
echo sum=$sum
:wq
[root@centos8 ~]# bash for_sum.sh 
sum=5050
​
[root@centos8 ~]# vim for_sum2.sh 
#!/bin/bash
# 
#********************************************************************
#Author:            zhanghui
#QQ:                19661891
#Date:              2020-11-29
#FileName:         for_sum2.sh
#URL:               raymond.blog.csdn.net
#Description:      The test script
#Copyright (C):     2020 All rights reserved
#********************************************************************
N=100
for ((i=1;i<=$N;i++));do
    let sum+=i
done
echo sum=$sum
:wq
[root@centos8 ~]# bash for_sum2.sh 
sum=5050
​
​
[root@centos8 ~]# vim while_sum.sh 
#!/bin/bash
# 
#********************************************************************
#Author:            zhanghui
#QQ:                19661891
#Date:              2020-11-28
#FileName:         while_sum.sh
#URL:               raymond.blog.csdn.net
#Description:      The test script
#Copyright (C):     2020 All rights reserved
#********************************************************************
sum=0
i=1
N=100
while [ $i -le $N ];do                                                                                        
    sum=$[${sum}+${i}]
    i=$[$i+1]
done
echo "sum=$sum"
:wq
[root@centos8 ~]# bash while_sum.sh 
sum=5050

7.将指定目录下的所有文件的后缀改名为 bak 后缀

[root@centos8 ~]# mkdir /data/test
[root@centos8 ~]# cd /data/test
[root@centos8 test]# vim ~/for_rename.bak 
#!/bin/bash
#
#********************************************************************
#Author:            zhanghui
#QQ:                19661891
#Date:              2020-11-29
#FileName:         for_rename.sh
#URL:               raymond.blog.csdn.net
#Description:      The test script
#Copyright (C):     2020 All rights reserved
#********************************************************************
DIR=/data/test
cd $DIR
for FILE in * ;do
    PRE=`echo $FILE | sed -nr 's/(.*).([^.]+)$/\1/p'`                                                        
    mv $FILE $PRE.bak
done
[root@centos8 test]# bash ~/for_rename.bak 
[root@centos8 test]# ls
a.bak  b.bak  c.bak

8.要求将目录YYYY-MM-DD/中所有文件,移动到YYYY-MM/DD/下

#1 创建YYYY-MM-DD,当前日期一年前365天到目前共365个目录,里面有10个文件,$RANDIM.log
[root@centos8 ~] #vim for_dir.sh 
#!/bin/bash
#
#********************************************************************
#Author:            zhanghui
#QQ:                19661891
#Date:              2020-11-29
#FileName:          for_dir.sh
#URL:               raymond.blog.csdn.net
#Description:       The test script
#Copyright (C):     2020 All rights reserved
#********************************************************************
PDIR=/data/test
for i in {1..365};do
    SUBDIR=`date -d "-$i day" +%F`
    mkdir $PDIR/$SUBDIR
    cd $PDIR/$SUBDIR 
    for j in {1..10};do
        touch $RANDOM.log
    done    
done
:wq
[root@centos8 ~]# bash for_dir.sh 
[root@centos8 ~]# ls /data/test
2019-11-30  2020-01-10  2020-02-20  2020-04-01  2020-05-12  2020-06-22  2020-08-02  2020-09-12  2020-10-23
2019-12-01  2020-01-11  2020-02-21  2020-04-02  2020-05-13  2020-06-23  2020-08-03  2020-09-13  2020-10-24
2019-12-02  2020-01-12  2020-02-22  2020-04-03  2020-05-14  2020-06-24  2020-08-04  2020-09-14  2020-10-25
2019-12-03  2020-01-13  2020-02-23  2020-04-04  2020-05-15  2020-06-25  2020-08-05  2020-09-15  2020-10-26
2019-12-04  2020-01-14  2020-02-24  2020-04-05  2020-05-16  2020-06-26  2020-08-06  2020-09-16  2020-10-27
2019-12-05  2020-01-15  2020-02-25  2020-04-06  2020-05-17  2020-06-27  2020-08-07  2020-09-17  2020-10-28
2019-12-06  2020-01-16  2020-02-26  2020-04-07  2020-05-18  2020-06-28  2020-08-08  2020-09-18  2020-10-29
2019-12-07  2020-01-17  2020-02-27  2020-04-08  2020-05-19  2020-06-29  2020-08-09  2020-09-19  2020-10-30
2019-12-08  2020-01-18  2020-02-28  2020-04-09  2020-05-20  2020-06-30  2020-08-10  2020-09-20  2020-10-31
2019-12-09  2020-01-19  2020-02-29  2020-04-10  2020-05-21  2020-07-01  2020-08-11  2020-09-21  2020-11-01
2019-12-10  2020-01-20  2020-03-01  2020-04-11  2020-05-22  2020-07-02  2020-08-12  2020-09-22  2020-11-02
2019-12-11  2020-01-21  2020-03-02  2020-04-12  2020-05-23  2020-07-03  2020-08-13  2020-09-23  2020-11-03
2019-12-12  2020-01-22  2020-03-03  2020-04-13  2020-05-24  2020-07-04  2020-08-14  2020-09-24  2020-11-04
2019-12-13  2020-01-23  2020-03-04  2020-04-14  2020-05-25  2020-07-05  2020-08-15  2020-09-25  2020-11-05
2019-12-14  2020-01-24  2020-03-05  2020-04-15  2020-05-26  2020-07-06  2020-08-16  2020-09-26  2020-11-06
2019-12-15  2020-01-25  2020-03-06  2020-04-16  2020-05-27  2020-07-07  2020-08-17  2020-09-27  2020-11-07
2019-12-16  2020-01-26  2020-03-07  2020-04-17  2020-05-28  2020-07-08  2020-08-18  2020-09-28  2020-11-08
2019-12-17  2020-01-27  2020-03-08  2020-04-18  2020-05-29  2020-07-09  2020-08-19  2020-09-29  2020-11-09
2019-12-18  2020-01-28  2020-03-09  2020-04-19  2020-05-30  2020-07-10  2020-08-20  2020-09-30  2020-11-10
2019-12-19  2020-01-29  2020-03-10  2020-04-20  2020-05-31  2020-07-11  2020-08-21  2020-10-01  2020-11-11
2019-12-20  2020-01-30  2020-03-11  2020-04-21  2020-06-01  2020-07-12  2020-08-22  2020-10-02  2020-11-12
2019-12-21  2020-01-31  2020-03-12  2020-04-22  2020-06-02  2020-07-13  2020-08-23  2020-10-03  2020-11-13
2019-12-22  2020-02-01  2020-03-13  2020-04-23  2020-06-03  2020-07-14  2020-08-24  2020-10-04  2020-11-14
2019-12-23  2020-02-02  2020-03-14  2020-04-24  2020-06-04  2020-07-15  2020-08-25  2020-10-05  2020-11-15
2019-12-24  2020-02-03  2020-03-15  2020-04-25  2020-06-05  2020-07-16  2020-08-26  2020-10-06  2020-11-16
2019-12-25  2020-02-04  2020-03-16  2020-04-26  2020-06-06  2020-07-17  2020-08-27  2020-10-07  2020-11-17
2019-12-26  2020-02-05  2020-03-17  2020-04-27  2020-06-07  2020-07-18  2020-08-28  2020-10-08  2020-11-18
2019-12-27  2020-02-06  2020-03-18  2020-04-28  2020-06-08  2020-07-19  2020-08-29  2020-10-09  2020-11-19
2019-12-28  2020-02-07  2020-03-19  2020-04-29  2020-06-09  2020-07-20  2020-08-30  2020-10-10  2020-11-20
2019-12-29  2020-02-08  2020-03-20  2020-04-30  2020-06-10  2020-07-21  2020-08-31  2020-10-11  2020-11-21
2019-12-30  2020-02-09  2020-03-21  2020-05-01  2020-06-11  2020-07-22  2020-09-01  2020-10-12  2020-11-22
2019-12-31  2020-02-10  2020-03-22  2020-05-02  2020-06-12  2020-07-23  2020-09-02  2020-10-13  2020-11-23
2020-01-01  2020-02-11  2020-03-23  2020-05-03  2020-06-13  2020-07-24  2020-09-03  2020-10-14  2020-11-24
2020-01-02  2020-02-12  2020-03-24  2020-05-04  2020-06-14  2020-07-25  2020-09-04  2020-10-15  2020-11-25
2020-01-03  2020-02-13  2020-03-25  2020-05-05  2020-06-15  2020-07-26  2020-09-05  2020-10-16  2020-11-26
2020-01-04  2020-02-14  2020-03-26  2020-05-06  2020-06-16  2020-07-27  2020-09-06  2020-10-17  2020-11-27
2020-01-05  2020-02-15  2020-03-27  2020-05-07  2020-06-17  2020-07-28  2020-09-07  2020-10-18  2020-11-28
2020-01-06  2020-02-16  2020-03-28  2020-05-08  2020-06-18  2020-07-29  2020-09-08  2020-10-19
2020-01-07  2020-02-17  2020-03-29  2020-05-09  2020-06-19  2020-07-30  2020-09-09  2020-10-20
2020-01-08  2020-02-18  2020-03-30  2020-05-10  2020-06-20  2020-07-31  2020-09-10  2020-10-21
2020-01-09  2020-02-19  2020-03-31  2020-05-11  2020-06-21  2020-08-01  2020-09-11  2020-10-22


#2 移动到YYYY-MM/DD下
[root@centos8 /data/script]#vim for_mv.sh
#!/bin/bash
#
#********************************************************************
#Author:            zhanghui
#QQ:                19661891
#Date:              2020-11-29
#FileName:          for_mv.sh
#URL:               raymond.blog.csdn.net
#Description:       The test script
#Copyright (C):     2020 All rights reserved
#********************************************************************
DIR=/data/test
cd $DIR
for SRC in *;do
    YYYY_MM=`echo $SRC | cut -d"-" -f1,2`
    DD=`echo $SRC | cut -d"-" -f3`
    [ -d ${YYYY_MM}/$DD ] || mkdir -p ${YYYY_MM}/$DD &> /dev/null
    mv $SRC/* ${YYYY_MM}/$DD
done
rm -rf $DIR/*-*-*
:wq
[root@centos8 ~]# bash for_mv.sh 
[root@centos8 ~]# ls /data/test/
2019-11  2020-01  2020-03  2020-05  2020-07  2020-09  2020-11
2019-12  2020-02  2020-04  2020-06  2020-08  2020-10

9.扫描一个网段10.0.0/24(10.0.0.1-10.0.0.254),判断此网段中主机在线状态, 将在线的主机IP打印出来

root@ubuntu2004:~# vim check_host.sh 
#!/bin/bash
#
#********************************************************************
#Author:            zhanghui
#QQ:                19661891
#Date:              2020-12-20
#FileName:          check_host.sh
#URL:               raymond.blog.csdn.net
#Description:       The test script
#Copyright (C):     2020 All rights reserved
#********************************************************************
net=10.0.0
for i in {1..254};do
    { ping -c1 -w1 $net.$i &>/dev/null && echo $net.$i is up | tee -a hostlist.log || echo $net.$i is down;}&
done
wait
:wq
​
[root@centos8 ~]# bash for_scan_host.sh 
10.0.0.7 is up
10.0.0.2 is up
10.0.0.6 is up
10.0.0.8 is up
10.0.0.150 is up
10.0.0.1 is down
10.0.0.3 is down
10.0.0.5 is down
10.0.0.11 is down
10.0.0.4 is down
10.0.0.17 is down
10.0.0.20 is down
10.0.0.13 is down
10.0.0.15 is down
10.0.0.23 is down
10.0.0.25 is down
10.0.0.27 is down
10.0.0.19 is down
10.0.0.10 is down
10.0.0.9 is down
10.0.0.12 is down
10.0.0.14 is down
10.0.0.16 is down
10.0.0.21 is down
10.0.0.18 is down
10.0.0.30 is down
10.0.0.34 is down
10.0.0.105 is down
10.0.0.44 is down
10.0.0.80 is down
10.0.0.45 is down
10.0.0.92 is down
10.0.0.48 is down
10.0.0.94 is down
10.0.0.60 is down
10.0.0.95 is down
10.0.0.64 is down
10.0.0.65 is down
10.0.0.84 is down
10.0.0.101 is down
10.0.0.73 is down
10.0.0.71 is down
10.0.0.97 is down
10.0.0.103 is down
10.0.0.40 is down
10.0.0.78 is down
10.0.0.75 is down
10.0.0.82 is down
10.0.0.69 is down
10.0.0.88 is down
10.0.0.99 is down
10.0.0.54 is down
10.0.0.67 is down
10.0.0.108 is down
10.0.0.49 is down
10.0.0.118 is down
10.0.0.38 is down
10.0.0.86 is down
10.0.0.42 is down
10.0.0.120 is down
10.0.0.90 is down
10.0.0.29 is down
10.0.0.112 is down
10.0.0.107 is down
10.0.0.36 is down
10.0.0.114 is down
10.0.0.122 is down
10.0.0.123 is down
10.0.0.130 is down
10.0.0.50 is down
10.0.0.128 is down
10.0.0.58 is down
10.0.0.52 is down
10.0.0.124 is down
10.0.0.56 is down
10.0.0.126 is down
10.0.0.62 is down
10.0.0.116 is down
10.0.0.32 is down
10.0.0.26 is down
10.0.0.22 is down
10.0.0.24 is down
10.0.0.28 is down
10.0.0.79 is down
10.0.0.31 is down
10.0.0.115 is down
10.0.0.102 is down
10.0.0.113 is down
10.0.0.72 is down
10.0.0.125 is down
10.0.0.109 is down
10.0.0.106 is down
10.0.0.139 is down
10.0.0.77 is down
10.0.0.131 is down
10.0.0.129 is down
10.0.0.111 is down
10.0.0.127 is down
10.0.0.76 is down
10.0.0.33 is down
10.0.0.85 is down
10.0.0.110 is down
10.0.0.104 is down
10.0.0.74 is down
10.0.0.81 is down
10.0.0.83 is down
10.0.0.117 is down
10.0.0.100 is down
10.0.0.35 is down
10.0.0.143 is down
10.0.0.70 is down
10.0.0.121 is down
10.0.0.119 is down
10.0.0.39 is down
10.0.0.37 is down
10.0.0.133 is down
10.0.0.41 is down
10.0.0.47 is down
10.0.0.46 is down
10.0.0.135 is down
10.0.0.66 is down
10.0.0.137 is down
10.0.0.141 is down
10.0.0.55 is down
10.0.0.57 is down
10.0.0.43 is down
10.0.0.144 is down
10.0.0.146 is down
10.0.0.148 is down
10.0.0.59 is down
10.0.0.157 is down
10.0.0.218 is down
10.0.0.180 is down
10.0.0.158 is down
10.0.0.96 is down
10.0.0.206 is down
10.0.0.191 is down
10.0.0.211 is down
10.0.0.194 is down
10.0.0.225 is down
10.0.0.169 is down
10.0.0.170 is down
10.0.0.224 is down
10.0.0.192 is down
10.0.0.87 is down
10.0.0.93 is down
10.0.0.91 is down
10.0.0.190 is down
10.0.0.159 is down
10.0.0.98 is down
10.0.0.178 is down
10.0.0.179 is down
10.0.0.160 is down
10.0.0.195 is down
10.0.0.182 is down
10.0.0.219 is down
10.0.0.171 is down
10.0.0.205 is down
10.0.0.193 is down
10.0.0.132 is down
10.0.0.209 is down
10.0.0.213 is down
10.0.0.221 is down
10.0.0.53 is down
10.0.0.215 is down
10.0.0.181 is down
10.0.0.216 is down
10.0.0.210 is down
10.0.0.68 is down
10.0.0.51 is down
10.0.0.175 is down
10.0.0.173 is down
10.0.0.172 is down
10.0.0.89 is down
10.0.0.212 is down
10.0.0.163 is down
10.0.0.164 is down
10.0.0.217 is down
10.0.0.165 is down
10.0.0.183 is down
10.0.0.223 is down
10.0.0.134 is down
10.0.0.140 is down
10.0.0.174 is down
10.0.0.203 is down
10.0.0.214 is down
10.0.0.200 is down
10.0.0.156 is down
10.0.0.202 is down
10.0.0.204 is down
10.0.0.155 is down
10.0.0.176 is down
10.0.0.166 is down
10.0.0.63 is down
10.0.0.207 is down
10.0.0.198 is down
10.0.0.226 is down
10.0.0.185 is down
10.0.0.153 is down
10.0.0.142 is down
10.0.0.186 is down
10.0.0.184 is down
10.0.0.196 is down
10.0.0.222 is down
10.0.0.208 is down
10.0.0.151 is down
10.0.0.138 is down
10.0.0.187 is down
10.0.0.197 is down
10.0.0.145 is down
10.0.0.147 is down
10.0.0.227 is down
10.0.0.149 is down
10.0.0.168 is down
10.0.0.199 is down
10.0.0.188 is down
10.0.0.136 is down
10.0.0.189 is down
10.0.0.152 is down
10.0.0.161 is down
10.0.0.61 is down
10.0.0.167 is down
10.0.0.177 is down
10.0.0.231 is down
10.0.0.220 is down
10.0.0.229 is down
10.0.0.154 is down
10.0.0.228 is down
10.0.0.232 is down
10.0.0.230 is down
10.0.0.162 is down
10.0.0.233 is down
10.0.0.201 is down
10.0.0.239 is down
10.0.0.235 is down
10.0.0.240 is down
10.0.0.238 is down
10.0.0.234 is down
10.0.0.236 is down
10.0.0.237 is down
10.0.0.243 is down
10.0.0.253 is down
10.0.0.251 is down
10.0.0.242 is down
10.0.0.246 is down
10.0.0.245 is down
10.0.0.244 is down
10.0.0.250 is down
10.0.0.249 is down
10.0.0.254 is down
10.0.0.252 is down
10.0.0.247 is down
10.0.0.248 is down
10.0.0.241 is down
​
root@ubuntu2004:~# cat hostlist.log 
10.0.0.2 is up
10.0.0.20 is up
10.0.0.6 is up
10.0.0.18 is up
10.0.0.8 is up
10.0.0.7 is up