7.SHELL脚本编程练习

SHELL脚本

1、编写脚本 systeminfo.sh,显示当前主机系统信息,包括:主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小

#!/bin/bash
echo -e "\e[1;32m   主机名:\t$(hostname) \e[0m"
echo -e "\e[1;32m   IP地址:\t$(ip address | sed -nr 's/^(.*inet )(([0-9]+\.){3}[0-9]+).* brd.*/\2/p') \e[0m"
echo -e "\e[1;32m 系统版本:\t$(cat /etc/redhat-release) \e[0m"
echo -e "\e[1;32m 内核版本:\t$(uname -r) \e[0m"
echo -e "\e[1;32m  CPU型号:\t$(lscpu | sed -nr 's/^Model name: *([^$])/\1/p') \e[0m"
echo -e "\e[1;32m 内存大小:\t$(free -h | awk '/^Mem/{print $2}') \e[0m"
echo -e "\e[1;32m 硬盘大小:\t$(lsblk | sed -nr 's/^(nv*|sd*).* ([0-9]+[A-Z]) .*/\2/p') \e[0m"

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

#!/bin/bash
ls /backup > /dev/null || mkdir /backup && cp -r /etc /backup/etc`date +%F`
echo "备份完成"

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

#!/bin/bash
MAX=`df | grep '^/dev/sd' | grep -Eo '[0-9]+%' | tr -d '%' | sort -nr | head -1`
echo "当前硬盘分区中空间利用率最大的值:$MAX"

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

#!/bin/bash
echo "  连接数  IPv4地址"
netstat -tn | tr -s ' ' | cut -d' ' -f5 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | sort -nr | uniq -c

条件测试

1、编写脚本 argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数

#!/bin/bash
[ "$#" -lt 1 ] && echo "请提供一个参数" || echo `grep '^$' $1 | wc -l`

2、编写脚本 hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”

#!/bin/bash
IP=172.16.0.8
ping -c1 -W1 $IP &> /dev/null && echo "$IP is up" || echo "$IP is down"

3、编写脚本 checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满

#!/bin/bash
WARNING=80
BLOCK=`df | grep '^/dev/sd' | grep -Eo '[0-9]+%' | tr -d '%' | sort -nr | head -1`
INODE=`df -i | grep '^/dev/sd' | grep -Eo '[0-9]+%' | tr -d '%' | sort -nr | head -1`
[ "$BLOCK" -gt "$WARNING" -o "$INODE" -gt "$WARNING" ] && echo "DISK USED: $BLOCK%, INODE USED: $INODE%, will be full" | mail -s "DISK WARNING" root

4、编写脚本 per.sh,判断当前用户对指定参数文件,是否不可读并且不可写

#!/bin/bash
! [ -r "$1" -a -w "$1" ] && echo "$1不可读写" || echo "$1可读写"

5、编写脚本 excute.sh ,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限,否则提示用户非脚本文件

#!/bin/bash
[[ $1 =~ \.sh$ ]] && chmod +x $1 || echo "not shell file."

6、编写脚本 nologin.sh和 login.sh,实现禁止和允许普通用户登录系统

#!/bin/bash
id $1 | cut -d ' ' -f1 | grep -Eo "[0-9]{4}" &> /dev/null && usermod -L $1 && echo "$1 disable" || echo "Non-normal user"

#!/bin/bash
usermod -U $1 && echo "$1 enable"

bash配置文件

1、让所有用户的PATH环境变量的值多出一个路径,例如:/usr/local/apache/bin 2、用户 root 登录时,将命令指示符变成红色,并自动启用如下别名: rm=‘rm –i’

cdnet=‘cd /etc/sysconfig/network-scripts/’
editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eth0’
editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 或 ifcfg-ens33 ’ (如果系统是CentOS7)

[root@localhost data]#cat ~/.bashrc 
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
	. /etc/bashrc
fi
PS1=\[\e[1;31m\][\u@\h \W]\$\[\e[0m\]
export PS1
alias cdnet='cd /etc/sysconfig/network-scripts'
alias editnet='vim /etc/sysconfig/network-scripts/ifcfg-eth0'

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

#!/bin/bash
echo -e '\033[31m hi,dangerous! \033[0m'

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

流程控制

条件选择

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


2、编写脚本 yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息


3、编写脚本 filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)

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


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

for

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

#!/bin/bash
DIR=/var
cd $DIR
for FILE in *
do
    echo `file $FILE`
done

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


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


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

#!/bin/bash
read -p "请输入一个正整数:" num
sum=0
for i in `seq $num`
do
   let sum+=i
done
echo sum=$sum

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

#!/bin/bash
sum=0
for i in {1..100}
do
    [ $[i%3] == 0 ] && let sum+=i
done
echo sum=$sum

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


7、打印九九乘法表

#!/bin/bash
for i in {1..9}
do
    for j in `seq $i`
    do
        echo -ne "${j}x$i=$((j*i))\t"
    done
    echo
done

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


9、打印等腰三角形


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

#!/bin/bash
for i in {10..1}
do
    if [ $i == 10 ];then
        sum=1
    elif [ $i == 9 ];then
        sum=(1+1)*2
    else
        let sum=sum*2+2
    fi
done
echo 第一天共摘了$sum个桃子

while

1、编写脚本,求100以内所有正奇数之和

#!/bin/bash
sum=0
count=1
while [ $count -le 100 ]
do
    let sum+=count
    let count+=2
done
echo sum=$sum

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


3、编写脚本,打印九九乘法表


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


5、编写脚本,实现打印国际象棋棋盘


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

continue、break、shift

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


2、随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出


3、用文件名做为参数,统计所有参数文件的总行数


4、用二个以上的数字为参数,显示其中的最大值和最小值

function

1. 编写函数,实现OS的版本判断

#!/bin/bash
version(){
    cat /etc/centos-release
}
version

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

#!/bin/bash
ETH=eth0
ip(){
    ifconfig $ETH | sed -nE "2s/^[^0-9]+([0-9.]+).*/\1/p"
}
ip

3. 编写函数,实现打印绿色OK和红色FAILED

#!/bin/bash
. /etc/init.d/functions

ok_failed(){
    action "ok"
    action "failed" false
}
ok_failed

4. 编写函数,实现判断是否无位置参数,如无参数,提示错误

#!/bin/bash

. /etc/init.d/functions

parameter(){
    [ $1 ] && action "当前参数:$*" || action "当前无参数" false
}
parameter $*

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

#!/bin/bash
  
max(){
    [ $# -eq 2 ] && (a=$1 b=$2;[ ${a} -gt ${b} ] && echo MAX=${a} || echo MAX=${b}) || echo "请输入两个位置参数"
}
max $*

6. 编写服务脚本/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/lock/subsys/SCRIPT_NAME文件不存在,则显示“SCRIPT_NAME is
stopped...”
(7)在所有模式下禁止启动该服务,可用chkconfig 和 service命令管理 说明:SCRIPT_NAME为当前脚本名

#先将 testservice 复制到 /etc/init.d 目录下
[root@localhost ~]#chmod +x /etc/init.d/testservice
[root@localhost ~]#service testservice start
[root@localhost ~]#service testservice stop
[root@localhost ~]#service testservice restart
[root@localhost ~]#service testservice status

[root@localhost ~]#chkconfig --add testservice
[root@localhost ~]#chkconfig testservice on
[root@localhost ~]#chkconfig --list testservice

7. 编写脚本/root/bin/copycmd.sh
(1) 提示用户输入一个可执行命令名称
(2) 获取此命令所依赖到的所有库文件列表
(3) 复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下如:/bin/bash ==> /mnt/sysroot/bin/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退出

8. 斐波那契数列又称黄金分割数列,因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2),利用函数,求n阶斐波那契数列

 9. 汉诺塔(又称河内塔)问题是源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘,利用函数,实现N片盘的汉诺塔的移动步骤

array

1. 输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序
2. 将下图所示,实现转置矩阵 matrix.sh
1 2 3          1 4 7
4 5 6 ===> 2 5 8
7 8 9          3 6 9
3. 打印杨辉三角形

  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值