AI智能
改变未来

SHELL脚本编程练习题

文章目录

  • 1、编写脚本 systeminfo.sh,显示当前主机系统信息,包括:主机名,IPv4地址,操作系统版本,内核
  • 2、编写脚本 backup.sh,可实现每日将/etc/目录备份到/backup/etcYYYY-mm-dd中
  • 3、编写脚本 disk.sh,显示当前硬盘分区中空间利用率最大的值
  • 4、编写脚本 links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序。
  • 5.IP的有效性实验
  • 6.if,else嵌套性试验(检测用户是否存在,存在即显示信息,否则询问是否创建此用户)
  • 6.1知识点总结:
  • 7.磁盘邮件预警
  • 8.让所有用户的PATH环境变量的值多出一个路径,例如:usr/local/apach/bin
  • 9.用户root登录时,将命令提示符变成红色,并自动启用如下别名:rm=\’rm-i\’,cdnet=\’cd /etc/sysconfig/network-scripts/\’
  • 10.任意用户登录系统时,显示红色字体的警示信息“Hi,dangerous!”
  • 11.编写生成脚本基本格式的脚本,包括作者,联系方式,版本,时间描述等。
  • 12.测试网络连通性
  • 13.编写脚本createuser.sh,实现如下功能:使用一个用户名作为参数,如果指定参数的用户存在就显示其存在,否则添加它。并设置初始化密码为123456,显示添加用户的id号等信息在此新用户第一次登录时,会提示用户立即更改密码,如果没有参数,就提示:请输入用户名。
  • 14.编写脚本yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes或者no,或者其他的信息。
  • 15.编写脚本filetype.sh判断用户输入文件文件路径,显示其文件类型,(普通,目录吗,连接,其他文件类型)
  • 16.编写脚本checkint.sh判断用户输入的参数是否为正整数
  • 17.编写脚本reset.sh,实现系统安装后的初始化环境,包括1,别名 2,环境变量,,如PS1等3,安装常用软件包如:tree5,实现固定的IP设置6vim的设置等。
  • 18.程序出错,中断整个脚本
  • 19.利用for循环语句进行一些工作
    • 19.1 判断/var/目录下所有文件的类型
    • 19.2添加10个用户user1-user10,密码为8位随机字符
    • 19.3/etc/rc.d/rc3.d目录下分别分别有多个以k开头和以S开头的文件;分别读取每个文件以k开头的输出为文件加stop,以S开头的输出为文件名加start,如K34filename stop S66filename start
    • 19.4编写脚本,提示输入正整数n的值,计算1+2+…n的总和
    • 19.5计算100以内所有能被3整除的整数之和
    • 19.6编写脚本,提示请输入网址,如192.168.0.0,判断输入的网段中主机在线的状
    • 19.7打印99乘法表
    • 19.8在/etcdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如:1AbCdeFgH.html
    • 19.9打印等腰三角形
    • 19.10猴子第一天摘下若干个桃子,当即吃了一半,还不够,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只剩下一个桃子,求第一天摘了多少桃子。
  • 20.利用while实现脚本
    • 20.1编写脚本,求100内所有正奇数之和
    • 20.2编写脚本,提示输入网络地址,如192.168.0.0,判断输入的网段中主机的在线状态,并统计在线和离线主机各有多少
    • 20.3编写脚本,打印9×9乘法表
    • 20.4 编写脚本用变量RANDOM生成10个随机数,输出这10个数字,并显示其中的最大值和最小值。
    • 20.5编写脚本,实现打印国际象棋
    • 20.6后续六个字符串:efbaf257cd、4be9c40b8b、44b2395c46、f8c8873ce0、b902c16c8b、ad865d2f63是通过对随机数变量RANDOM随机执行命令:echo$RANDOM|md5sum|cut -c1-10后的结果,请破解这些字符对应的RANDOM值。
  • 21.每隔三秒钟到系统上获取已经登录的用户信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log中,并退出脚本
  • 22 . 用文件名做参数,统计所有参数文件的总行数
  • 23.用两个以上的数字为参数,显示其中的最大值和最小值。
  • 24.编写函数,实现os的版本判断
  • 25.编写函数,实现取出当前系统eth0的IP地址
  • 26.编写函实现打印绿色ok和红色failed
  • 27.编写函数,实现判断是否无未知参数,如无参数,提示错误
  • 28.编写函数,实现两个数字作为参数返回最大值
  • 29.编写脚本/root/bin/testsrv.sh完成如下要求
  • 30.编写脚本/root/bin/copycmd.sh
  • 1、编写脚本 systeminfo.sh,显示当前主机系统信息,包括:主机名,IPv4地址,操作系统版本,内核

    版本,CPU型号,内存大小,硬盘大小

    #!/bin/bashCL=\"\\033[1;32m\"END=\'\\033[0m\'IPV4=`ifconfig eth0 |grep -Eo \'([0-9]{1,3}\\.){3}[0-9]{1,3}\'|head -n1`VS=`uname -a`KN=`uname -r`CPU=`lscpu |grep \'Model name\' |tr -s \' \' |cut -d: -f2`MEMORYSIZE=`free -h |grep \'Mem\' |tr -s \' \' : |cut -d: -f2`DISKSIZE=`lsblk |grep \'^sd\' |tr -s \' \'  |cut -d \' \' -f1,4 |paste -s -d, `echo -e \"Hostname is :          ${CL}${HOSTNAME}${END}\"echo -e \"IPV4 adress is :       ${CL}${IPV4}${END}\"echo -e \"system\'s version :     ${CL}${VS}${END}\"echo -e \"Kernel version is :    ${CL}${KN}${END}\"echo -e \"CPU version is :       ${CL}${CPU}${END}\"echo -e \"Memory\'s size is :     ${CL}${MEMORYSIZE}${END}\"echo -e \"Disk size is :         ${CL}${DISKSIZE}${END}\"

    2、编写脚本 backup.sh,可实现每日将/etc/目录备份到/backup/etcYYYY-mm-dd中

    #!/bin/bashCL=\"\\033[1;32m\"END=\"\\033[0m\"DT=`date +%F_%T`cp -av /etc /data/backup/etc_back.${DT}sleep 3echo -e  \" ${CL}Done!${END} \"

    3、编写脚本 disk.sh,显示当前硬盘分区中空间利用率最大的值

    #!/bin/bashCL=\"\\033[1;33m\"END=\"\\033[0m\"TLN=`df |tr -s \' \' % |cut -d% -f5 |sort -nr |head -n1`echo -e \"The largest rate used   of disk partition is :${CL}${TLN}${END}\"~

    4、编写脚本 links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序。

    TLN=`ss -nt |ss -nt |tail -n +2 |tr -s \' \' \':\' |cut -d: -f4 |uniq -c |sort -nr`ADDR=`ss -nt |ss -nt |tail -n +2 |tr -s \' \' \':\' |cut -d: -f4 `echo -e \"Display the remote host connect\'s address and number of times:\\n${ADDR} \"echo -e \"sort positive sequence the num of address connect: ${TLN}\"~

    5.IP的有效性实验

    [[  ]]

    6.if,else嵌套性试验(检测用户是否存在,存在即显示信息,否则询问是否创建此用户)

    read -p \"Please input the username :\" NAMEINFO=\"echo `id ${NAME}`\"ifid ${NAME} &> /dev/nullthenecho -e \"\\033[1;32mThe user ${NAME} is exist,and ${NAME}\'s information:\\n${INFO}\\033[0m\"elseecho -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 :\" YNif[[ ${YN} =~ ^([Yy]|[Ee]|[Ss])$ ]];thenuseradd ${NAME};echo \"${NAME}:123456\" |chpasswdchage -d1 ${NAME}echo \"The default password is 123456 ,you must change your passwd next login (force)\"elseecho -e \"\\033[1;33mwill leave and exit!!!\\033[0m\"fifi

    6.1知识点总结:

    1.读入

    read -p \"提示语\" 	Agagaecho $Agaga

    2.变量赋值与输出

    变量赋值A=“ ”  A=\" echo \\`id ${NAME}\\` \"NAME=aecho $NAME1echo${NAME}1NAME=\"`cat /dev/urandom |tr -dc \'[[:alnum:]]\' |head -c7` \"echo $NAMEtyBThpiecho ${NAME}tyBThpi

    赋值打印seq的结果

    NAME=`seq 10`echo $NAME1 2 3 4 5 6 7 8 9 10echo ${NAMR}1 2 3 4 5 6 7 8 9 10echo \"$NAME\"12345678910echo \"${NAME}\"12345678910

    3.命令静默并传回值

    id ${NAME} &> /dev/null

    插入(ls xxx > /dev/null 2&>1;echo $?)回传的值总是错误
    4.条件性测试
    [ ]
    [[ ${YN} =~ ^([Yy]|[Ee]|[Ss])$ ]]支持摸估,==通配符摸估。=~正则表达式摸估
    5.非交互式修改口令
    echo “name:passwd ” |chpasswd
    6.账户过期设置(下次登录必须修改口令)

    chage -d1 ${NAME}passwd -e ${NAME}

    chage -d参数可以将到期时间修改为指定天数
    passwd -e 参数可以强制用户下次登录强制修改口令
    7.if,else嵌套语句结构

    ifthenelseifthenelsefifi

    7.磁盘邮件预警

    #!/bin/bashWARNINFO=\"`df |grep -E \'^/dev/sd*\' |tr -s \' \' |cut -d \' \' -f1,5,6 |sort -nr -k2 |head -n3`\"#LARSET=\"`df |grep -E \'^/dev/sd*\' |tr -s \' \' |cut -d \' \' -f1,5,6 |sort -nr -k2 |head -n1`\"#LARSET=\"`echo ${WARNINF} |tr -s \' \' \'%\' |cut -d% -f2 |sort -nr|head -n1`\"VALURE=\"`echo $WARNINFO |tr -s \'%\' \' \'|sort -nr |head -n1|cut -d \' \' -f2 `\"if[[ $VALURE -ge 10 ]]thenecho -e \"Your host\'s disk rate is more than 10%\\n${WARNINFO}\" |mail -v -s \"disk_rate \" 949786521@qq.comecho \"The rate is ${VAlURE} \"elseecho \"正常\"fi

    8.让所有用户的PATH环境变量的值多出一个路径,例如:usr/local/apach/bin

    修改环境变量
    1.临时修改变量

    PATH=$PATH:/usr/local/apache/binecho $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/apache/bin

    2.永久修改环境变量

    vim ~/.bashrcPATH=$PATH:$HOME:usr/local/apache/bin

    9.用户root登录时,将命令提示符变成红色,并自动启用如下别名:rm=‘rm-i’,cdnet=‘cd /etc/sysconfig/network-scripts/’

    vim /etc/profile.d/~/.bashrcPS1=\\033[1;31m     \\033[0mrm=\"rm-i\"cdnet=\"cd /etc/sysconfig/network-scripts/\"

    10.任意用户登录系统时,显示红色字体的警示信息“Hi,dangerous!”

    登录前信息显示:

    vim /etc/issue.d/*.shHi,dangerous!

    登陆后信息显示:

    vim /etc/motdwelcome to liujiajun\'s computer!!!

    11.编写生成脚本基本格式的脚本,包括作者,联系方式,版本,时间描述等。

    vim /etc/vimrcvim ~/.vimrc

    请参考此链接内的题目1

    12.测试网络连通性

    read -p \"please input the adress\" ADDRESSifping -c2 -w2 ${ADDRESS} &> /dev/nullthenecho \"${ADDRESS} is up\"elifgrep -q \"${ADDRESS}\" ~/maintenance.txtthenecho \"${ADDRESS} is undergoing maintenance\"elseecho \"station is unexpecedly DOWN!\"fi

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

    read -p \"Please input the username :\" NAMEINFO=\"echo `id ${NAME}`\"ifid ${NAME} &> /dev/nullthenecho -e \"\\033[1;32mThe user ${NAME} is exist,and ${NAME}\'s information:\\n${INFO}\\033[0m\"elseecho -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 :\" YNif[[ ${YN} =~ ^([Yy]|[Ee]|[Ss])$ ]];thenuseradd ${NAME};echo \"${NAME}:123456\" |chpasswdchage -d1 ${NAME}echo \"The default password is 123456 ,you must change your passwd next login (force)\"elseecho -e \"\\033[1;33mwill leave and exit!!!\\033[0m\"fifi

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

    read -p \"Do you agree(yes/no)?\" INPUTVALUE=`echo $INPUT |tr -s \'A-Z\' \'a-z\'`case ${INPUT} inyes|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:\" FILEif[  -f ${FILE} ]thenecho \"Its a  normal file!\"elif[ -d ${FILE} ]thenecho \"Its a directory!\"elif[ -l ${FILE} ]thenecho\"Its a link file!\"elif[ -b ${FILE} ]thenecho \"Its a block file!\"elif[ -c ${FILE} ]thenecho \"Its a character file!\"elif[ -s ${FILE} ]thenecho \"Its a socket file!\"elif[ -p ${FILE} ]thenecho \"Its a pipe file!\"fi

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

    read -p \"Please input the number:\" NUMif#       [ -n \"`echo ${NUM} |sed  \'s/[0-9]/g/\'`\" ] && [ ${NUM} -gt 0  ][[ ${NUM} =~ ^([0-9]+)$ ]] && [ ${NUM}  -gt 0  ]thenecho \"The number is  positive int\"elseecho \"The number is not positive int\"fi~

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

    正在完善中。。。

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

    if[ $? -ne 0 ]thenreturn $?

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

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

    read -p \"please input the directory : \" DIRfor i in `ls ${DIR}`doif[ -b  ${DIR}/${i} ]thenecho \"${i} is a block file\"elif[ -c  ${DIR}/${i} ]thenecho \"${i} is a character file\"elif[ -f  ${DIR}/${i} ]thenecho \"${i} is a normal file\"elif[ -h  ${DIR}/${i} ]thenecho \"${i} is a link file\"elif[ -p  ${DIR}/${i} ]thenecho \"${i} is a pipe file\"elif[ -d  ${DIR}/${i} ]thenecho \"${i} is a directory!\"elif[ -s ${DIR}/${i} ]thenecho \"${i} is a socket file\"fidone

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

    #!/bin/bashfor i in {1..10}douseradd user${i}pass=`cat /dev/urandom |tr -dc \'[[:alnum:]]\' |head -c 8 `echo ${pass} |passwd --stdinecho ${pass} >> /data/passwd.txtdoneecho \"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`doif[ \"$(echo ${i} |cut -c1)\" == \"S\" ]thenecho -e \"${i} start\"elseecho -e \"${i} stop\"fidone

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

    #!/bin/bashread -p \"please input positive int n\" Nfor((sum=0,i=1;i<=${N};sum+=i,i++))dotruedoneecho \"the result is ${sum}\"

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

    #!/bin/bashsum=0for i in {1..100}doif[ $[${i}%3] -eq 0 ]thensum=$[$sum+$i]fidoneecho \"the result is $sum\"

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

    read -p \"please input the adress\" ADDRESSifping -c2 -w2 ${ADDRESS} &> /dev/nullthenecho \"${ADDRESS} is up\"elifgrep -q \"${ADDRESS}\" ~/maintenance.txtthenecho \"${ADDRESS} is undergoing maintenance\"elseecho \"station is unexpecedly DOWN!\"fi

    19.7打印99乘法表

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

    mkdir -p /data/num_uradomfor i in {1..10}docd /data/num_urandomtouch ${i}`cat /dev/urandom |tr -dc \'[[:alnum:]]\' |head -c8`.htmldone

    19.9打印等腰三角形

    for((i=1;i<=9;i++))dofor((j=9;j>=i;j--))doecho -n \" \"donefor((j=2;j<=i;j++))doecho -n \"*\"for((j=1;j<=i;j++))doecho -n \"*\"donedonedone

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

    #!/bin/bashsum=1for ((n=1;n<10;n++));do??sum=$[2*$[$sum+1]]doneecho \"所摘桃子数: $sum\"``

    20.利用while实现脚本

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

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

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

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

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

    for((i=1;i<=8;i++));dofor((j=1;j<=8;j++));dolet sum=(\"$i\"+\"$j\")%2if [ \"${sum}\" -eq 1 ];thenecho -ne \"\\033[1;43m  \\033[0m\"elseecho -ne \"\\033[1;47m  \\033[0m\"fidoneechodone

    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\' ;dosleep 3donewho |grep \'^hacker\' |tr -s \' \' |cut -d \' \' -f1,3,5 >>/var/log/login.logecho \"日志信息已记录\"

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

    read -p \"Please input a little filename: \" FILESwhile [ -n \"$FILES\" ];doecho -e \"\\033[1;33m lines are `cat $FILES |wc -l` \\e[0m\"breakdone

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

    两个数字比较:

    if [ $# -ne 2 ];thenecho -e \"\\033[1;31m input two  number at least!!! \\033[0m\"elif [[ $1 =~ ^[0-9]+$ ]] && [[ $2 =~ ^[0-9]+$ ]];thenif [ $1 -lt $2 ];thenecho \"the largest number is \\$2:$2 ,the less number is \\$1:$1\"elif [ $1 -gt $2 ];thenecho \"the largest number is \\$1:$1 ,the less number is \\$2:$2\"elseecho \"two number is queal\"afielseecho -e \"\\033[1,31m please input number!!!\\33[0m\"fi

    大于两个数字以上:

    
    

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

    
    

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

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

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

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

    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为当前脚本

    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退出。

    (5)

    赞(0) 打赏
    未经允许不得转载:爱站程序员基地 » SHELL脚本编程练习题