shell脚本练习
Posted wangshilin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本练习相关的知识,希望对你有一定的参考价值。
1、
通过位置变量创建linux系统账户及密码
$1 是执行脚本的第一个参数,$2 是执行脚本的第二个参数
1#!/bin/bash
2 # Author: wangshilin
3 # Blog: https://home.cnblogs.com/wangshilin/
4 useradd "$!"
5 echo "$2 | passwd --stdin $2 "
2、
每周5使用tar命令备份/var/log 下的所有日志文件,防止文件覆盖
1 #!/bin/bash
2 # Author: wangshilin
3 # Blog: https://home.cnblogs.com/wangshilin/
4 # Time: 2019-08-17 01:31:13
5 tar -czf log -`date +%Y%m%d` .tar.gz /var/log
6 00 03 * * 5 /root /logbak.sh
3、
实时监控本机内存和硬盘剩余空间,剩余内存小于500M,根分区剩余空间小于1000M的时候发送报警邮件
#!/bin/bash
#3
disk =$(df -h / | awk ‘/\\//print $4‘)
mem=$(df -h / | awk ‘/\\//print $4‘)
if [ $disk -le 512000 -a $mem -le 1024000 ]; then
mail -s Waring root << EOF
echo"Insufficient resources"
exit 0
fi
4、
脚本生成一个 100 以内的随机数值,提示用户猜数字,更具用户的输入,提示用户猜对了,猜打了或猜小了,直至用户猜对脚本结束。
#!/bin/bash
#4
num=$[RANDOM%100+1]
read -p "Please enter a number:" num
if [ $num -eq $num ]; then
echo "You right"
exit
elif [ $num -gt $num ]; then
echo "Oops,You big"
else
echo"Osps You small"
fi
5、
检测本机当前用户是否为超级管理员,如果是管理员,使用 yum 安装 vsftpd,如果不是,则提示您非管理员,使用字串对比版本
#!/bin/bash
#5
if [ $UID -eq 0 ]; then
yum -y install vsftpd
else
echo "You do not administrator"
fi
~
6、
依次提示用户输入 3 个整数,脚本根据数字大小依次排序输出 3 个数字
#!/bin/bash
#
read -p "请输入一个整数:" num1
read -p "请输入一个整数:" num2
read -p "请输入一个整数:" num3
#不管谁大谁小,最后都打印 echo "$num1,$num2,$num3"
#num1 中永远存最小的值,num2 中永远存中间值,num3 永远存最大值
tmp=0
if [ $num1 -gt $num2 ];then
tmp=$num1
num1=$num2
num2=$tmp
fi
if [ $num1 -gt $num3 ];then
tmp=$num1
num1=$num3
num3=$tmp
fi
if [ $num2 -gt $num3 ];then
tmp=$num2
num2=$num3
num3=$tmp
fi
echo "排序后数据为:$num1,$num2,$num3
7、
编写脚本,实现人机《石头,剪刀,布》游戏
game=(石头 剪刀 布)
num=$[RANDOM%3]
computer=$game[$num]#通过随机数获取计算机的出拳
#出拳的可能性保存在一个数组中,game[0],game[1],game[2]分别是 3 中不同的可能
echo "请根据下列提示选择您的出拳手势"
echo "1.石头"
echo "2.剪刀"
echo "3.布"
read -p "请选择 1-3:" person
case $person in
1)
if [ $num -eq 0 ];then
echo "平局"
elif [ $num -eq 1 ];then
echo "你赢"
else
echo "计算机赢"
fi;;
2)
if [ $num -eq 0 ];then
echo "计算机赢"
elif [ $num -eq 1 ];then
echo "平局"
else
echo "你赢"
fi;;
3)
if [ $num -eq 0 ];then
echo "你赢"
elif [ $num -eq 1 ];then
echo "计算机赢"
else
echo "平局"
fi;;
*)
echo "必须输入 1-3 的数字"
esac
[root@localhost ~]# vim 7.sh
game=(石头 剪刀 布)
num=$[RANDOM%3]
computer=$game[$num]#通过随机数获取计算机的出拳
#出拳的可能性保存在一个数组中,game[0],game[1],game[2]分别是 3 中不同的可能
echo "请根据下列提示选择您的出拳手势"
echo "1.石头"
echo "2.剪刀"
echo "3.布"
read -p "请选择 1-3:" person
case $person in
1)
if [ $num -eq 0 ];then
echo "平局"
elif [ $num -eq 1 ];then
echo "你赢"
else
echo "计算机赢"
fi;;
2)
if [ $num -eq 0 ];then
echo "计算机赢"
elif [ $num -eq 1 ];then
echo "平局"
else
echo "你赢"
fi;;
3)
if [ $num -eq 0 ];then
echo "你赢"
elif [ $num -eq 1 ];then
echo "计算机赢"
else
echo "平局"
fi;;
*)
echo "必须输入 1-3 的数字"
esac
8、
编写脚本测试192.168.4.0/24整个网段中那些主机处于开机状态,那些主机处于关机状态(for 版本)
#!/bin/bash
#
for i in 1..254 do
ping -f 1 -i 0.2 -W 1 192.168.4.$i &>/dev/null
if [ $? –eq 0 ];then
echo "192.168.4.$i is up"
else
echo "192.168.4.$i is down"
fi
done
9、
编写脚本测试 192.168.4.0/24 整个网段中那些主机处于开机状态,那些主机处于关机状态(多进程版),定义一个函数来实现,ping 某一台主机,并检测主机的存货状态
#!/bin/bash
#9
myping()
ping -c2 -i0.3 -W1 $1 &>/dev/null
if [ $? -eq 0 ];then
echo "$1 is up"
else
echo "$1 is down"
fi
for i in 1..254
do
myping 192.168.4.$i &
done
10、
编写脚本,复制文件的时候,显示进度条
i=0
str=‘#‘
ch=(‘|‘ ‘\\‘ ‘-‘ ‘/‘)
index=0
while [ $i -le 25 ]
do
printf "[%-25s][%d%%][%c]\\r" $str $(($i*4)) $ch[$index]
str+=‘#‘
let i++
let index=i%4
sleep 0.1
done
printf "\\n"
11、9*9 乘法表(编写 shell 脚本,打印 9*9 乘法表)
#!/bin/bash
for i in `seq 9`
do
for j in `seq $i`
do
echo -n "$i*$j=$[i*j] "
done
echo
done
12、
使用死循环实时显示 eth0 网卡发送的数据包流量
1 #!/bin/bash
2 # Author: wangshilin
3 # Blog: https://home.cnblogs.com/wangshilin/
4 # Time: 2019-08-17 01:48:21
5 while :
7 do
9 echo ‘本地网卡 eth0 流量信息如下: ‘
11 ifconfig eno16777736 | grep "RX pack" | awk ‘print $5‘
13 ifconfig eno16777736 | grep "TX pack" | awk ‘print $5‘
15 sleep 1
17 done
1、通过位置变量创建linux系统账户及密码$1 是执行脚本的第一个参数,$2 是执行脚本的第二个参数
#!/bin/bash#1useradd "$!"echo "$2 | passwd --stdin $2 "
2、每周5使用tar命令备份/var/log 下的所有日志文件,防止文件覆盖tar -czf log -`date +%Y%m%d` .tar.gz /var/log00 03 * * 5 /root /logbak.sh
3、实时监控本机内存和硬盘剩余空间,剩余内存小于500M,根分区剩余空间小于1000M的时候发送报警邮件#!/bin/bash#3disk =$(df -h / | awk ‘/\\//print $4‘)mem=$(df -h / | awk ‘/\\//print $4‘)if [ $disk -le 512000 -a $mem -le 1024000 ]; then mail -s Waring root << EOF echo"Insufficient resources" exit 0fi
4、 脚本生成一个 100 以内的随机数值,提示用户猜数字,更具用户的输入,提示用户猜对了,猜打了或猜小了,直至用户猜对脚本结束。
#!/bin/bash#4num=$[RANDOM%100+1]read -p "Please enter a number:" numif [ $num -eq $num ]; then echo "You right" exitelif [ $num -gt $num ]; then echo "Oops,You big"else echo"Osps You small"fi
5、检测本机当前用户是否为超级管理员,如果是管理员,使用 yum 安装 vsftpd,如果不是,则提示您非管理员,使用字串对比版本
#!/bin/bash#5if [ $UID -eq 0 ]; then yum -y install vsftpdelse echo "You do not administrator"fi~
6、依次提示用户输入 3 个整数,脚本根据数字大小依次排序输出 3 个数字
#!/bin/bash#read -p "请输入一个整数:" num1read -p "请输入一个整数:" num2read -p "请输入一个整数:" num3#不管谁大谁小,最后都打印 echo "$num1,$num2,$num3"#num1 中永远存最小的值,num2 中永远存中间值,num3 永远存最大值
tmp=0if [ $num1 -gt $num2 ];then tmp=$num1 num1=$num2 num2=$tmpfi
if [ $num1 -gt $num3 ];then tmp=$num1 num1=$num3 num3=$tmpfi
if [ $num2 -gt $num3 ];then tmp=$num2 num2=$num3 num3=$tmpfiecho "排序后数据为:$num1,$num2,$num3
7、编写脚本,实现人机《石头,剪刀,布》游戏
game=(石头 剪刀 布)num=$[RANDOM%3]computer=$game[$num]#通过随机数获取计算机的出拳#出拳的可能性保存在一个数组中,game[0],game[1],game[2]分别是 3 中不同的可能
echo "请根据下列提示选择您的出拳手势"echo "1.石头"echo "2.剪刀"echo "3.布"read -p "请选择 1-3:" person
case $person in
1)if [ $num -eq 0 ];then echo "平局"elif [ $num -eq 1 ];then echo "你赢"else echo "计算机赢"fi;;
2)if [ $num -eq 0 ];then echo "计算机赢"elif [ $num -eq 1 ];then echo "平局"else echo "你赢"fi;;
3)if [ $num -eq 0 ];then echo "你赢"elif [ $num -eq 1 ];then echo "计算机赢"else echo "平局"fi;;*) echo "必须输入 1-3 的数字"esac[root@localhost ~]# vim 7.sh game=(石头 剪刀 布)num=$[RANDOM%3]computer=$game[$num]#通过随机数获取计算机的出拳#出拳的可能性保存在一个数组中,game[0],game[1],game[2]分别是 3 中不同的可能
echo "请根据下列提示选择您的出拳手势"echo "1.石头"echo "2.剪刀"echo "3.布"read -p "请选择 1-3:" person
case $person in
1)if [ $num -eq 0 ];then echo "平局"elif [ $num -eq 1 ];then echo "你赢"else echo "计算机赢"fi;;
2)if [ $num -eq 0 ];then echo "计算机赢"elif [ $num -eq 1 ];then echo "平局"else echo "你赢"fi;;
3)if [ $num -eq 0 ];then echo "你赢"elif [ $num -eq 1 ];then echo "计算机赢"else echo "平局"fi;;*) echo "必须输入 1-3 的数字"esac
8、编写脚本测试192.168.4.0/24整个网段中那些主机处于开机状态,那些主机处于关机状态(for 版本)#!/bin/bash#for i in 1..254 do ping -f 1 -i 0.2 -W 1 192.168.4.$i &>/dev/null if [ $? –eq 0 ];then echo "192.168.4.$i is up" else echo "192.168.4.$i is down" fidone
9、编写脚本测试 192.168.4.0/24 整个网段中那些主机处于开机状态,那些主机处于关机状态(多进程版),定义一个函数来实现,ping 某一台主机,并检测主机的存货状态
#!/bin/bash#9myping() ping -c2 -i0.3 -W1 $1 &>/dev/null if [ $? -eq 0 ];then echo "$1 is up" else echo "$1 is down" fi
for i in 1..254do myping 192.168.4.$i &done
10、编写脚本,复制文件的时候,显示进度条
i=0str=‘#‘ch=(‘|‘ ‘\\‘ ‘-‘ ‘/‘)index=0while [ $i -le 25 ]do printf "[%-25s][%d%%][%c]\\r" $str $(($i*4)) $ch[$index] str+=‘#‘ let i++ let index=i%4 sleep 0.1doneprintf "\\n"
11、9*9 乘法表(编写 shell 脚本,打印 9*9 乘法表)
#!/bin/bashfor i in `seq 9`do for j in `seq $i` do echo -n "$i*$j=$[i*j] " done echodone
12、使用死循环实时显示 eth0 网卡发送的数据包流量
13、使用user.txt 文件中的人员名单,在计算机中自动创建对应的账户并配置初始密码脚本执行,需要提前准备一个 user.txt 文件,该文件中包含有若干用户信息
14、编写批量修改扩展名脚本,如批量将 txt 文件修改为doc文件执行脚本时,需要给脚本添加位置参数脚本名 txt doc (可以将 txt 的扩展名修改为doc)脚本名 doc jpg(可以将doc 的扩展名修改为jpg)
15、查看有多少远程的 IP 在连接本机(不管是通过 ssh 还是 web 还是 ftp 都统计)使用 netstat -atn 可以查看本机所有连接状态,-a 查看所有,-t 仅显示tcp连接信息, -n数字格式显示local address(第四列是本机的IP和端口信息)Foreign address(第五烈是远程主机的IP和端口信息)使用awk命令仅显示第5列数据,再显示第1列IP地址的信息sort 可以按数字的大小排序,最后使用 Uniq 将多余重复的删除,并统计重复次数
16、对100 以内的所有正整数相加求和(1+2+3.。。+100)eq 100 可以快速自动生成100个整数
以上是关于shell脚本练习的主要内容,如果未能解决你的问题,请参考以下文章