Bootstrap

SHELL脚本编程练习题_二、if,else嵌套性试验(检测用户是否存在,存在即显示信息,否则询问是否创建此

then
echo “${ADDRESS} is undergoing maintenance”
else
echo “station is unexpecedly DOWN!”
fi


## 13.编写脚本createuser.sh,实现如下功能:使用一个用户名作为参数,如果指定参数的用户存在就显示其存在,否则添加它。并设置初始化密码为123456,显示添加用户的id号等信息在此新用户第一次登录时,会提示用户立即更改密码,如果没有参数,就提示:请输入用户名。



read -p “Please input the username :” NAME
INFO=“echo id ${NAME}
if
id ${NAME} &> /dev/null
then
echo -e “\033[1;32mThe user ${NAME} is exist,and KaTeX parse error: Undefined control sequence: \n at position 22: …'s information:\̲n̲{INFO}\033[0m”
else
echo -e "The user ${NAME} dont exist "
echo -e “\033[1;31mI will crate the account ${NAME},please choice “yes” or “no” \033[0m”

    read -p "Please choice :" YN
    if 
            [[ ${YN} =~ ^([Yy]|[Ee]|[Ss])$ ]];
    then
            useradd ${NAME};
            echo "${NAME}:123456" |chpasswd
            chage -d1 ${NAME}
            echo "The default password is 123456 ,you must change your passwd next login (force)"
    else
            echo -e "\033[1;33mwill leave and exit!!!\033[0m"
    fi

fi


## 14.编写脚本yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes或者no,或者其他的信息。



read -p “Do you agree(yes/no)?” INPUT
VALUE=echo $INPUT |tr -s 'A-Z' 'a-z'
case ${INPUT} in
yes|ye|y)
echo “you input is YES”
;;
no|n)
echo “you input is NO”
;;
*)
echo “you input is others”
esac


## 15.编写脚本filetype.sh判断用户输入文件文件路径,显示其文件类型,(普通,目录吗,连接,其他文件类型)



read -p “Please input the file name what you want to test:” FILE
if
[ -f ${FILE} ]
then
echo “Its a normal file!”
elif
[ -d ${FILE} ]
then
echo “Its a directory!”
elif
[ -l ${FILE} ]
then
echo"Its a link file!"

elif
[ -b ${FILE} ]
then
echo “Its a block file!”
elif
[ -c ${FILE} ]
then
echo “Its a character file!”
elif
[ -s ${FILE} ]
then
echo “Its a socket file!”
elif
[ -p ${FILE} ]
then
echo “Its a pipe file!”
fi


## 16.编写脚本checkint.sh判断用户输入的参数是否为正整数



read -p “Please input the number:” NUM
if

[ -n “echo ${NUM} |sed 's/[0-9]/g/'” ] && [ ${NUM} -gt 0 ]

    [[ ${NUM} =~ ^([0-9]+)$ ]] && [ ${NUM}  -gt 0  ]

then
echo “The number is positive int”
else
echo “The number is not positive int”
fi
~


## 17.编写脚本reset.sh,实现系统安装后的初始化环境,包括1,别名 2,环境变量,,如PS1等3,安装常用软件包如:tree5,实现固定的IP设置6vim的设置等。


正在完善中。。。


## 18.程序出错,中断整个脚本


方法一、



if
[ $? -ne 0 ]
then
return $?


方法二、



set -e 加set -e参数,但凡脚本出现非0返回值,中断整个脚本


## 19.利用for循环语句进行一些工作


### 19.1 判断/var/目录下所有文件的类型



read -p "please input the directory : " DIR
for i in ls ${DIR}
do
if
[ -b D I R / {DIR}/ DIR/{i} ]
then
echo “${i} is a block file”
elif
[ -c D I R / {DIR}/ DIR/{i} ]
then
echo “${i} is a character file”
elif
[ -f D I R / {DIR}/ DIR/{i} ]
then
echo “${i} is a normal file”
elif
[ -h D I R / {DIR}/ DIR/{i} ]
then
echo “${i} is a link file”
elif
[ -p D I R / {DIR}/ DIR/{i} ]
then
echo “${i} is a pipe file”
elif
[ -d D I R / {DIR}/ DIR/{i} ]
then
echo “${i} is a directory!”
elif
[ -s D I R / {DIR}/ DIR/{i} ]
then
echo “${i} is a socket file”
fi
done


### 19.2添加10个用户user1-user10,密码为8位随机字符



#!/bin/bash
for i in {1…10}
do
useradd user${i}
pass=cat /dev/urandom |tr -dc '[[:alnum:]]' |head -c 8
echo ${pass} |passwd --stdin
echo ${pass} >> /data/passwd.txt
done
echo “the user user{i} is created!”


### 19.3/etc/rc.d/rc3.d目录下分别分别有多个以k开头和以S开头的文件;分别读取每个文件以k开头的输出为文件加stop,以S开头的输出为文件名加start,如K34filename stop S66filename start



for i in ls /etc/rc.d/rc3.d
do
if
[ “$(echo i ∣ c u t − c 1 ) " = = " S " ] t h e n e c h o − e " {i} |cut -c1)" == "S" ] then echo -e " icutc1)"=="S"]thenechoe"{i} start”
else
echo -e “${i} stop”
fi
done


### 19.4编写脚本,提示输入正整数n的值,计算1+2+…n的总和



#!/bin/bash
read -p “please input positive int n” N
for((sum=0,i=1;i<=${N};sum+=i,i++))
do
true
done
echo “the result is ${sum}”


### 19.5计算100以内所有能被3整除的整数之和



#!/bin/bash
sum=0
for i in {1…100}
do
if
[ [ [ [{i}%3] -eq 0 ]
then
sum= [ [ [sum+$i]
fi
done
echo “the result is $sum”


### 19.6编写脚本,提示请输入网址,如192.168.0.0,判断输入的网段中主机在线的状



read -p “please input the adress” ADDRESS

if
ping -c2 -w2 KaTeX parse error: Expected 'EOF', got '&' at position 11: {ADDRESS} &̲> /dev/null the…{ADDRESS} is up"
elif
grep -q “ A D D R E S S "   / m a i n t e n a n c e . t x t t h e n e c h o " {ADDRESS}" ~/maintenance.txt then echo " ADDRESS" /maintenance.txtthenecho"{ADDRESS} is undergoing maintenance”
else
echo “station is unexpecedly DOWN!”
fi


### 19.7打印99乘法表


### 19.8在/etcdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如:1AbCdeFgH.html



mkdir -p /data/num_uradom
for i in {1…10}
do
cd /data/num_urandom
touch ${i}cat /dev/urandom |tr -dc '[[:alnum:]]' |head -c8.html
done


### 19.9打印等腰三角形



for((i=1;i<=9;i++))
do
for((j=9;j>=i;j–))
do
echo -n " "
done

    for((j=2;j<=i;j++))
    do
            echo -n "\*"

    for((j=1;j<=i;j++))
    do
            echo -n "\*"
    done
    done

done


### 19.10猴子第一天摘下若干个桃子,当即吃了一半,还不够,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只剩下一个桃子,求第一天摘了多少桃子。



#!/bin/bash
sum=1
for ((n=1;n<10;n++));do
??sum= [ 2 ∗ [2* [2[$sum+1]]
done
echo “所摘桃子数: $sum”``


## 20.利用while实现脚本


### 20.1编写脚本,求100内所有正奇数之和


### 20.2编写脚本,提示输入网络地址,如192.168.0.0,判断输入的网段中主机的在线状态,并统计在线和离线主机各有多少


### 20.3编写脚本,打印9x9乘法表


### 20.4 编写脚本用变量RANDOM生成10个随机数,输出这10个数字,并显示其中的最大值和最小值。


### 20.5编写脚本,实现打印国际象棋



for((i=1;i<=8;i++));do
for((j=1;j<=8;j++));do
let sum=(“ i " + " i"+" i"+"j”)%2
if [ “${sum}” -eq 1 ];then
echo -ne “\033[1;43m \033[0m”
else
echo -ne “\033[1;47m \033[0m”
fi
done
echo
done


### 20.6后续六个字符串:efbaf257cd、4be9c40b8b、44b2395c46、f8c8873ce0、b902c16c8b、ad865d2f63是通过对随机数变量RANDOM随机执行命令:echo$RANDOM|md5sum|cut -c1-10后的结果,请破解这些字符对应的RANDOM值。


## 21.每隔三秒钟到系统上获取已经登录的用户信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log中,并退出脚本



until who |grep -q ‘^panda’ ;do
sleep 3
done
who |grep ‘^hacker’ |tr -s ’ ’ |cut -d ’ ’ -f1,3,5 >>/var/log/login.log
echo “日志信息已记录”


## 22 . 用文件名做参数,统计所有参数文件的总行数



read -p "Please input a little filename: " FILES
while [ -n “$FILES” ];do
echo -e “\033[1;33m lines are cat $FILES |wc -l \e[0m”
break
done


## 23.用两个以上的数字为参数,显示其中的最大值和最小值。(精)


两个数字比较:



if [ $# -ne 2 ];then
echo -e “\033[1;31m input two number at least!!! \033[0m”
elif [[ 1 =   [ 0 − 9 ] + 1 =~ ^[0-9]+ 1= [09]+ ]] && [[ 2 =   [ 0 − 9 ] + 2 =~ ^[0-9]+ 2= [09]+ ]];then
if [ $1 -lt $2 ];then
echo “the largest number is $2:$2 ,the less number is $1:$1”
elif [ $1 -gt $2 ];then
echo “the largest number is $1:$1 ,the less number is $2:$2”
else
echo "two number is queal"a
fi
else
echo -e “\033[1,31m please input number!!!\33[0m”

fi


大于两个数字以上:



#!/bin/bash
declare -i max min
declare -a nums
sum=KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲ nums=(@)
for((i=0;i<=$sum;i++));do
[ KaTeX parse error: Expected 'EOF', got '&' at position 11: i -eq 0 ] &̲& max={nums[0]} && min=${nums[0]} && continue
[ KaTeX parse error: Expected '}', got 'EOF' at end of input: {nums[i]} -gt KaTeX parse error: Expected 'EOF', got '&' at position 7: max ] &̲& max={nums[$i]} && continue
[ KaTeX parse error: Expected '}', got 'EOF' at end of input: {num[i]} -lt KaTeX parse error: Expected 'EOF', got '&' at position 7: min ] &̲& min={nums[$i]}
done

echo "all the parameter are : $@ "
echo “the max parameter is : $max”
echo “the min parameter is : $min”


## 24.编写函数,实现os的版本判断


注意:此处写成case模式更为繁琐,是为了实现更高级架构而设计成此



version=cat /etc/redhat-release | grep -o '[[:digit:]]' |head -c1
case v e r s i o n i n 4 ) e c h o " t h e v e r s i o n i s : C e n t O S {version} in 4) echo "the version is :CentOS versionin4)echo"theversionis:CentOS{version}"
;;
5)
echo “the version is :CentOS v e r s i o n " ; ; 6 ) e c h o " t h e v e r s i o n i s : C e n t O S {version}" ;; 6) echo "the version is :CentOS version";;6)echo"theversionis:CentOS{version}”
;;
7)
echo “the version is :CentOS v e r s i o n " ; ; 8 ) e c h o " t h e v e r s i o n i s : C e n t O S {version}" ;; 8) echo "the version is :CentOS version";;8)echo"theversionis:CentOS{version}”
esac


## 25.编写函数,实现取出当前系统eth0的IP地址



#ifconfig eth0 |sed -nr ‘2s/[^0-9]+([0-9.]+).*/\1/p’
#ifconfig eth0 |head -n2 |tail -n1 |tr -s ’ ’ |cut -d ’ ’ -f3
eth0(){
ifconfig eth0 |grep -w ‘inet’ |tr -s ’ ’ |cut -d ’ ’ -f3
}
eth0


## 26.编写函实现打印绿色ok和红色failed



okorfailed(){
if [ $? = 0 ];then
echo -e “\033[32m [ OK ]\033[0m”
else
echo -e “\033[1;31m [ Failed ] \033[0m”
fi
}
okorfailed


方法二:调用/etc/init.d/functions



#!/bin/bash
. /etc/init.d/functions
function ok(){
echo_success
}
function failure(){
echo_failure
}


## 27.编写函数,实现判断是否无未知参数,如无参数,提示错误



function arg (){
if [ $# -eq 0 ];then
echo “please input a arg!”
else
echo “total $# arg”
fi
}
arg 1 2 3 4
~


## 28.编写函数,实现两个数字作为参数返回最大值



#!/bin/bash
declare -i max min
declare -a nums
nums=(KaTeX parse error: Undefined control sequence: \* at position 1: \̲*̲) for((i=0;i<=#;i++));do
[ KaTeX parse error: Expected 'EOF', got '&' at position 11: i -eq 0 ] &̲& max={nums[0]} && min=${nums[0]} && continue
[ KaTeX parse error: Expected '}', got 'EOF' at end of input: {nums[i]} -gt KaTeX parse error: Expected 'EOF', got '&' at position 7: max ] &̲& max={sums[$i]} && continue
[ KaTeX parse error: Expected '}', got 'EOF' at end of input: {nums[i]} -lt KaTeX parse error: Expected 'EOF', got '&' at position 7: min ] &̲& min={nums[$i]}
done
echo “the max parameter is $max”


## 29.编写脚本/root/bin/testsrv.sh完成如下要求


(1)脚本可接受参数:start,stop,restart,status  
 (2)如果参数非此四者之一,提示使用格式后报错退出  
 (3)如是start:则创建/var/lock/subsys/SCRIPT\_NAME,并显示启动成功  
 (4)如果是stop:则删除/var/lock/subsys/SCRIPT\_NAME,并显示“停止完成”考虑:如果事先已经停止过了,该如何处理?  
 (5)如果是restart,则先stop,再start,考虑:如果本来没有start,如何处理?  
 (6)如果是status,则如果/var/lock/subsys/SCRIPT\_NAME文件存在,则显示“SCRIPT\_NAME is running …”,如果是/var/locksubsys/SCRIPT\_NAME文件不存在,则线回收“SCRIPT\_NAME is stopped…”  
 (7)在所有模式下禁止启动该服务,可用chkconfig和service  
 命令管理  
 说明:SCRIPT\_NAME为当前脚本



#!/bin/bash
name=$0
dir=/var/lock/subsys/
function judge(){
if [[ ! $arg =~ “start”|“stop”|“restart”|“status” ]];then
echo “please in put start、stop、restart、status”
fi
exit
}
function start1(){
mkdir -p ${dir}
touch d i r {dir} dir{name}
echo “launch successful!”
}
function stop1(){
if [ -e d i r {dir} dir{name} ];then
rm -rf d i r {dir} dir{name}
echo “stop success!”
else
echo “already stop!”
fi
}
function restart1(){
if [ ! -e d i r {dir} dir{name} ];then
stop1
start1
fi
}
function status1(){
if [ -e d i r {dir} dir{name} ];then
echo “ d i r {dir} dir{name} is running!”
else
echo “ d i r {dir} dir{name} is stopped…”
fi
}

cat<<EOF
input the parameter:
start)
stop)
restart)
status)
EOF
read -p “please input :” arg
judge
case arg in
start)
start1
;;
stop)
stop1
;;
restart)
restart1
;;
status)
status1
;;
*)
echo “please input the right parameter!”
exit 1
esac


## 30.编写脚本/root/bin/copycmd.sh


(1)提示用户输入一个可执行命令名称  
 (2)获取此命令所依赖的所有库文件列表  
 (3)复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下   
 如: /bin/bash==>/mnt/sysroot/bash  
 /usr/bin/passwd==>/mnt/sysroot/usr/bin/passwd  
 (4)复制此命令依赖的所有库文件至目标目录下的对应路径下,:如/lib64/ld-linux-x86-64.so.2==>/mnt/sysroot/lib64/ld-linux-x86-64.so.2  
 (5)每次复制完成一个命令后,不要退出,而是提示用户键入新的要复制的命令,并重复完后才能上述功能;知道用户输入quit退出。




知识点:  
 1.读取用户输入read命令,-p参数加上提示语句  
 2.获取命令所在文件所依赖的库列表,ldd (后面跟命令文件位置)  
 3.which +cmd 可以查出命令文件所在的位置。但是如果命令有别名,也会显示命令alias,可以加参数 --skip-alias 跳过别命名输出。


## 31.利用sshpass实现批量key验证



PASS=abc123
NET=10.0.0.
rpm -q sshpass &> /dev/null || yum -y install sshpass &> /dev/null

ssh-keygen -P “” -f /root/.ssh/id_rsa

for i in {3…254};do
{
sshpass -p ${PASS} ssh-copy-id -i /root/.ssh/id_rsa N E T {NET} NET{i} -o StrictHostKeyChecking=no &> /dev/null
}&
done
wait
###########################################################
NET=10.0.0.
rpm -q sshpass &> /dev/null || yum -y install sshpass &> /dev/null
ssh-keygen -P “” -f /root/.ssh/id_rsa
for i in {3…254};do
sshpass -f /data/passwd.txt ssh-copy-id -i /root/.ssh/id_rsa N E T {NET} NET{i} -o StrictHostKeyChecking=no &> /de
v/null
done
wait
########################################################
rpm -q sshpass &> /dev/null || yum -y install sshpass &> /dev/null

while read ip pass ;do
sshpass -p ${pass} ssh-copy-id -i /root/.ssh/id_rsa ${IP} -O StrictHostKeyChecking=no &>/dev/null
done</data/account.txt
wait


### 


## 




为了做好运维面试路上的助攻手,特整理了上百道 **【运维技术栈面试题集锦】** ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,**小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。**

![](https://img-blog.csdnimg.cn/img_convert/e9eddf184eeaf41f0553f8791c684dbf.png)

本份面试集锦涵盖了

*   **174 道运维工程师面试题**
*   **128道k8s面试题**
*   **108道shell脚本面试题**
*   **200道Linux面试题**
*   **51道docker面试题**
*   **35道Jenkis面试题**
*   **78道MongoDB面试题**
*   **17道ansible面试题**
*   **60道dubbo面试题**
*   **53道kafka面试**
*   **18道mysql面试题**
*   **40道nginx面试题**
*   **77道redis面试题**
*   **28道zookeeper**

**总计 1000+ 道面试题, 内容 又全含金量又高**

*   **174道运维工程师面试题**

> 1、什么是运维?

> 2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

> 3、现在给你三百台服务器,你怎么对他们进行管理?

> 4、简述raid0 raid1raid5二种工作模式的工作原理及特点

> 5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

> 6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

> 7、Tomcat和Resin有什么区别,工作中你怎么选择?

> 8、什么是中间件?什么是jdk?

> 9、讲述一下Tomcat8005、8009、8080三个端口的含义?

> 10、什么叫CDN?

> 11、什么叫网站灰度发布?

> 12、简述DNS进行域名解析的过程?

> 13、RabbitMQ是什么东西?

> 14、讲一下Keepalived的工作原理?

> 15、讲述一下LVS三种模式的工作过程?

> 16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

> 17、如何重置mysql root密码?

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
高**

*   **174道运维工程师面试题**

> 1、什么是运维?

> 2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

> 3、现在给你三百台服务器,你怎么对他们进行管理?

> 4、简述raid0 raid1raid5二种工作模式的工作原理及特点

> 5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

> 6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

> 7、Tomcat和Resin有什么区别,工作中你怎么选择?

> 8、什么是中间件?什么是jdk?

> 9、讲述一下Tomcat8005、8009、8080三个端口的含义?

> 10、什么叫CDN?

> 11、什么叫网站灰度发布?

> 12、简述DNS进行域名解析的过程?

> 13、RabbitMQ是什么东西?

> 14、讲一下Keepalived的工作原理?

> 15、讲述一下LVS三种模式的工作过程?

> 16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

> 17、如何重置mysql root密码?

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
;