shell 脚本100 例
1: 编写一个hello work 脚本 1 2 #! /bin/bash echo "hello word"
2: 通过位置变量创建linux系统账户及密码 1 2 3 #!/bin/bash useradd $1 -c "测试用户" -G root -s /usr/sbin/nologinecho $2 | passwd $1 --stdin
3: 每周5使用tar命令备份/var/log下的所有日志文件 1 2 3 4 5 6 7 8 9 #!/bin/bash tar zcPf /tmp/log -`date +%F-%H-%M`.tar.gz /var/log /*.log --- 00 03 * * 5 /bin/bash /tmp/备份.sh
4: 一键部署LNMP (rpm包版本) 1 2 3 4 5 6 7 8 9 #!/bin/bash yum install epel-release yum makecache yum install nginx yum install mysql yum install php php-mysql systemctl start nginx mysql systemctl enable nginx mysql
5: 实时监控本机内存和硬盘剩余空间,剩余内存小于500M ,根空间剩余小于1000M 时发送报警邮件给root管理员 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/bin/bash memu=400 diskmu=4000 mem=$(free -m | awk '/Mem/{print $4}' ) disk=$(df -m / | awk '/\//{print $4}' )if [ $mem -lt $memu -a $disk -lt $diskmu ];then echo "资源不够用" | mail root -s elif [ $mem -lt $memu ];then echo "内存小于$memu " | mail root -s elif [ $disk -lt $diskmu ];then echo "磁盘小于$diskmu " | mail root -sfi
6: 脚本生成一个100以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了或者猜小了 猜大了 直至用户结束脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #!/bin/bash yes=$[$RANDOM %10]echo -e "这是一个猜数字游戏 \n输入你要猜的数字进行" while true ;do read -p "请输入你要猜的数字:" num if grep -q '^[[:digit:]]*$' <<< "$num " ;then if [ $num -lt $yes ];then echo "数字小于正确答案" elif [ $num -gt $yes ];then echo "数字大于正确答案" elif [ $num -eq $yes ];then echo "恭喜你才对了" exit else echo "请输入真确的数字" fi else echo "请输入数字" fi done
7: 检测本机当前用户是否为超级管理员,如果是管理员, 则使用yum安装vsftp ,如果不是,则提示您非管理员(使用字符串对比版本) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #!/bin/bash if [[ $USER == "root" ]];then yum install vsftp -y else echo "请用管理员账号操作" fi ---#!/bin/bash if [[ $UID == 0 ]];then yum install vsftp -y else echo "请用管理员账号操作" fi
8: 编写脚本: 提示用户输入用户名和密码,脚本自动创建相应的账户和配置密码,如果用户不输入账户名,则提示必须输入账户名并退出脚本,如果用户不输入密码,则统一使用默认的123456 作为默认密码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #!/bin/bash read -p "输入要创建的用户名:" userif [ -n "$user " ];then useradd $user read -p "输入密码:" password password=${password:-123456} echo $password | passwd $user --stdinelse echo "必须输入用户名" exit 2fi
9: 依次提示用户输入3个整数,脚本根据数字大小依次排序输出3个数字 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #!/bin/bash read -p "输入多一个数字:" num1read -p "输入第二个数字:" num2read -p "输入第三个数字:" num3if [ $num1 -gt $num2 ];then tmp=$num1 num1=$num2 num2=$tmp fi if [ $num1 -gt $num3 ];then tmp=$num1 num1=$num3 num3=$tmp fi fi [ $num2 -gt $num3 ];then tmp=$num2 num2=$num3 num3=tmpfi echo "数字大小依次为:$num1 - $num2 - $num3 "
10: 编写脚本,实现人机 剪刀石头布游戏 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 #!/bin/bash num=$[$RANDOM %3+1]echo -e "1.石头 \n2.剪刀 \n3.布" read -p "输入1-3:" usercase $user in 1) if [ $num -eq 1 ];then echo "平局" elif [ $num -eq 2 ];then echo "你赢了" else echo "你输了" fi ;; 2) if [ $num -eq 2 ];then echo "平局" elif [ $num -eq 3 ];then echo "你赢了" else echo "你输了" fi ;; 3) if [ $num -eq 3 ];then echo "平局" elif [ $num -eq 1 ];then echo "你赢了" else echo "你输了" fi ;; *) echo "必须输入1-3数字" esac
11: 让 192.168.4.0/24 整个网段中那些主机处于开机状态, 那些处于关机状态(for while 多进程 实现) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 for i in {1..254};do ping -c2 -W1 192.168.249.$i >/dev/null if [ $? -eq 0 ];then echo "192.168.249.$i 上线" else echo "192.168.249.$i 下线" fi done ---while [ $i -le 254 ];do ping -c2 -W1 192.168.254.$i >dev/null if [ $? -eq 0 ];then echo "192.168.249.$i 上线" else echo "192.168.249.$i 下线" fi done ---myping (){ ping -c2 -W2 $1 &>/dev/null if [ $? -eq 0 ];then echo "$1 上线" else echo "$1 下线" fi }for i in {1..254};do myping 192.168.249.$i &done
12:编写脚本 显示进度条 1 2 3 4 5 6 7 8 9 10 11 12 #!/bin/bash jindu (){while true ;do echo -n "#" sleep 0.2done } jindu & cp -a /usr/ /tmp killall $!echo "拷贝完成"
13: 进度条 动态时钟脚 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #!/bin/bash jindu (){ sp=0.1 count=0 while true ;do count=$[$count +1] case $count in 1) echo -e "-\b\c" sleep $sp ;; 2) echo -e '\\' "\b\c" sleep $sp ;; 3) echo -e "|\b\c" sleep $sp ;; 4) echo -e "/\b\c" sleep $sp ;; *) count=0 esac done } jindu
14: 9*9 乘法表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #!/bin/bash for i in `seq 9`;do for j in `seq $i `;do echo -n "$i *$j =$[i*j] " done echo done
15: 使用死循环实时显示 ens33 网卡发送的数据包流量 1 2 3 4 5 6 7 8 9 10 11 12 13 #!/bin/bash read -p "输入要观察的网卡:" netif [ -z $net ];then echo "不能为空" exit 1fi while true ;do echo " 发送流量: `ifconfig $net | grep " RX packets" | awk '{print $6 ,$7 }'`" echo " 接受流量: `ifconfig $net | grep " TX packets" | awk '{print $6 ,$7 }'`" echo "-----------" sleep 1done
16: 使用user.txt 文件中的人员名单,在计算机中自动创建对应的用户并配置初始密码 1 2 3 4 5 6 7 8 9 10 11 #!/bin/bash read -p "输入初始化密码:" pwfor i in `cat user.txt`;do useradd $i && echo $pw | passwd $i --stdin if [ $? -eq 0 ];then echo "创建用户:$i ; 密码为:$pw " else echo "创建用户:$i 失败" fi done
17: 编写批量修改扩展名脚本,如 批量将txt文件修改为doc文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/bin/bash read -p "输入需要批量修改的目录:" dirread -p "输入修改的目标后缀:" suffixread -p "输入要修改成的后缀: " tag$cd $dir $rename $suffix $tag *for i in `ls $dir `;do mv $dir /$i $dir /$(echo $i | sed s@$suffix @$tag @)done
18: 使用expect 工具自动交互密码远程其他主机安装httpd 1 2 3 #!/bin/bash ansible node -m yum -a 'name=nginx'
19: 编写一个脚本点名器 1 2 3 4 5 6 7 8 9 10 #!/bin/bash while ;do line=`cat user.txt | wc -l` num=$[RANDOM%line+1] sed -n "${num} p" user.txt sleep 0.2done
20: 查看有多少远程的ip在连接本机,(不管是ssh还是http 还是ftp) 1 2 3 #!/bin/bash netstat -ant | awk '{print $5}' | sed -n '3,$p' | sort -nr | uniq -c
21: 对100以内的所有正整数相加求和 1 2 3 4 5 6 #!/bin/bash j=0for i in {1..100};do j=$[j+=i]done echo $j
22: 统计09:36-09:37 所有访问nginx服务器的请求有多少个 | 统计ip 有多少 1 2 3 #!/bin/bash awk -F ":" '$2":"$3 > "09:36" && $2":"$3 <= "09:37"{print $1}' mobile.haoqipei.com.log | awk '{print $1}' | sort -n | uniq -c
23: 打印国际象棋棋盘 1 2 3 4 5 6 7 8 9 10 11 12 13 #!/bin/bash for i in {1..8};do for j in {1..8};do sun=$[i+j] if [ $[sun%2] -eq 0 ];then echo -en "\033[46m \033[0m" fi echo -en "\033[47m \033[0m" done echo done
24: 统计每个远程ip访问真机nginx 多少次? 1 2 3 #!/bin/bash awk '{ip[$1]++}END{for (i in ip) print ip[i],i}' mobile.haoqipei.com.log
25: 统计当前linux系统中可以登录计算机的账户有多少?
26: 统计/var/log 有多少文件 并显示这些文件名 1 2 3 4 5 6 7 8 9 10 11 12 #!/bin/bash sum=0for i in `ls -r /var/log /*`;do if [ -f $i ];then let num++ echo "文件名: $i " fi done echo "文件总数为 $num "
27: 自动为其他脚本添加解释器信息, #!/bin/bash 1 2 3 4 5 #!/bin/bash if ! grep -q '#!/bin' $!;then sed '1i #!/bin/bash' $1 fi
28: 切割nginx日志 1 2 3 4 5 6 7 8 #!/bin/bash nginx_log_path="/var/log/nginx/" mv ${nginx_log_path} access.log ${nginx_log_path} access_$(date +%F).log kill -USER1 `cat /run/nginx.pid`
29: 检测mysql 数据库连接量 1 2 3 4 5 6 7 8 9 #!/bin/bash log_file=/tmp/mysql_login.log user=root passwd=123456while true ;do mysqladmin -u"$user " -p"$passwd " status | awk '{print $4}' >> $log_file sleep 2done
30: 根据md5 校验码, 检测文件是否被修改 1 2 3 4 5 #!/bin/bash for i in `ls /etc/*conf`;do md5sum "$i " >> /var/log /md5.logdone
40: 检测mysql服务是否存活 1 2 3 4 5 6 7 8 9 10 #!/bin/bash user=root passwd=passwd mysqladmin -u$user -p$passwd ping &>/dev/nullif [ $? -eq 0 ];then echo "mysql 启动状态" else echo "mysql 没有启动" fi
41: 备份mysql的shell脚本(mysqldump) 1 2 3 4 5 6 7 8 9 #!/bin/bash user=root passwd=passwd db=testdb [ ! d /mysqlback ] && mkdir /mysqlback mysqldump -u$user -p$passwd $db > /mysqlback/$db .sql
42: 将文件中所有的小写字母转行为大写字母 1 2 3 4 5 6 7 8 #!/bin/bash read -p "输入需要转行的文件:" file tr [a-z] [A-Z] < $file cat test.sh | tr [a-z] [A-Z] >> test.sh
43: 非交互自动生成ssh密钥 1 2 3 4 5 6 #!/bin/bash rm rf ~/.ssh/* ssh-keygen -t RSA -N '' -f ~/.ssh/id_rsa
44: 检测特定的软件是否已经安装 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/bin/bash read -p "输入要检测的软件:" packif [ -z $pack ];then echo "不能为空" exit 1fi rpm -q $pack &>/dev/nullif [ $? -eq 0 ];then echo "已安装" else echo "没有安装" exit 1fi
45:监控http服务器的状态(测试返回码) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #!/bin/bash url="https://h5.haoqipei.com" sum=0while true ;do sleep 10; code=$(curl -m 5 -o /dev/null -s -w %{http_code} $url )if [ $code -lt 200 ];then let sum+=1 if [ $sun -gt 3 ];then echo "网络失联30s, 请检查 http 服务" unset sum exit 1 fi fi done
46: 显示cpu 厂商信息 1 2 #!/bin/bash awk '/vendor_id/{print $3}' /proc/cpuinfo | uniq
47: 删除某个目录大小为0 的文件 1 2 3 4 5 #!/bin/bash dir=/usr/share find $dir -type f -szie 0 -exec rm -rf {} \;
48: 查找linux 系统中的僵尸进程 1 2 3 #!/bin/bash ps aux | awk '{if($8 == "Z"){print $2,$11}}'
49: 提示用户输入年份后测试判断是否为闰年 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #!/bin/bash read -p "输入年份:" yearif [ "$year " == "" ];then echo "输入有效年份" exit fi if [[ "$year " =~ [a-z] ]];then echo "输入的不是数字" exit fi if [ $[$year % 4] -eq 0 ] && [ $[$year % 100] -ne 0 ];then echo "$year 是闰年" elif [ $[year % 400] -eq 0];then echo "$year 是闰年" else echo "$year 不是闰年" fi
50: 生成随机密码, urandom版本 1 2 3 4 5 6 7 8 9 #!/bin/bash tr -dc '_A-Za-z0-9' </dev/urandom | head -c 10
51: 随机生成密码 1 2 3 4 5 6 7 #!/bin/bash uuidgenecho $$
52: shell脚本的fork炸弹 1 2 3 4 5 6 7 8 9 #!/bin/bash .(){ .|.& }; .
53: 批量下载有序文件 1 2 3 4 5 6 7 #!/bin/bash url=www.baidu.comtype =jpgfor i in `seq 100`;do curl $url /$i .$type -o /tmp/$i .$type sleep 2done
54: 显示当前计算机中所有账户的用户名称
55: 制定目录路径, 脚本自动将该目录使用tar命令打包备份到/data目录 1 2 3 4 5 6 7 8 9 10 #!/bin/bash read -p "输入要打包的目录路径(绝对路径):" dirif [ ! -d $dir ];then echo "目录不存在" fi tar zcvf /tmp/$dir .tar.gz $dir
56: 显示进度条(回旋镖版本) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/bin/bash while true ;do clear for i in `seq 20`;do echo -e "\033[3;${i} H*" sleep 0.1 done for i in {20..1};do echo -e "\033[3;${1} H*" sleep 0.1 done cleardone
57: 循环关闭局域网中所有主机 1 2 3 4 5 6 7 8 #!/bin/bash ip=90for i in {1..254};do if [ $i -ne $ip ];then echo "正在关闭 192.168.249.$i ..." ssh 192.168.249.$i poweroff fi done
58: 获取本机mac地址 1 2 #!/bin/bash ip a show ens33 | awk '/link\/ether^Cprint $2}'
59: 修改linux 系统里最大打开文件数量 1 2 3 4 5 6 #!/bin/bash cat >> /etc/security/limits.conf << EOF * soft nofile 65536 * hard nofile 65536 EOF
60: 自动修改计划任务配置文件 1 2 3 4 5 6 7 8 #!/bin/bash read -p "输入分钟信息(00-59):" minread -p "输入小时信息(00-24):" hourread -p "输入日期信息(01-31):" dateread -p "输入月份信息(01-12):" monthread -p "输入星期信息(00-06):" weakread -p "输入要执行的命令或者脚本:" programecho "$min $hour $date $month $weak $program " >> /etc/crontab
61: 找出/etc/passwd 中能登录的用户, 并将对应在/etc/shadow 中第二列密码提出处理 1 2 3 4 5 6 7 8 #!/bin/bash #!/bin/bash user=`awk -F':' '{print $1}' /etc/passwd`for i in $user ;do awk -F':' '/${i}/{print $1,$2}' /etc/shadow done
62: 使用脚本循环创建 三位数的文本文件 (111-999的文件) 1 2 3 4 5 6 7 8 9 #!/bin/bash mkdir -p /tmp/testnumfor i in {1..99};do for j in {1..99};do for k in {1..99};do touch /tmp/testnum/${i} ${j} ${k} .txt done done done
63: 统计/etc/passwd 中root 出现的次数 1 2 3 4 5 6 7 8 9 10 11 #!/bin/bash sum=0for i in `awk -F'/' '{print $NF}' /etc/passwd`;do if [ $i == "nologin" ];then let sum++ fi done echo $sum
64: 统计linux进程相关的数量信息 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #!/bin/bash running=0 sleeping=0 stoped=0 zombie=0for i in /proc/[1-9]*;do tatus=`awk '{print $3}' $i /stat ` case $tatus in R) running=$[running+1];; T) stoped=$[stoped+1];; S) sleeping=$[sleeping+1];; Z) zombie=$[zombie+1];; esac done echo "运行的:$running sleep的:$sleeping stop的:$stoped zeom的:$zombie "
65: 判断用户输入的数据类型, 1 2 3 4 5 6 7 8 9 10 11 #!/bin/bash read -p "请输入一个字符:" keycase $key in [a-z]|[A-Z]) echo "输入的是一个字母" ;; [0-9]) echo "输入的是一个数字" ;; *) echo "输入的是空格或功能键字符" esac
66: 打印斐波那契数列 (该数列的特点是最后一个数字 永远都是前2个数字之和) 1 2 3 4 5 6 7 8 #!/bin/bash list=(0 1)for i in `seq 2 11`;do list[$i ]=`expr ${list[-1]} + ${list[-2]} `done echo ${list[@]}
67: 判断用户输入的是yes还是no 1 2 3 4 5 6 7 8 9 10 11 12 #!/bin/bash read -p "输入yes或者no:" surecase $sure in yes|y|Y|yes) echo "输入的是yes" ;; no|NO|N|n) echo "输入的是no" ;; *) echo "error" esac
68: 显示本机上linux系统上所有的开发的端口列表 1 2 3 #!/bin/bash netstat -tlunp| awk '{print $1,$4}' |awk -F':' '{print "协议"$1,"端口"$NF}' | grep "[0-9]" | uniq
69: 将linux系统中UID 大于1000的用户都删除 1 2 3 4 5 #!/bin/bash user=`awk -F':' '$3>=1000{print $1}' /etc/passwd`for i in $user ;do userdel -r $i done
70: 使用脚本打印如下图像 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 #!/bin/bash for ((i=1;i<=9;i++));do for ((j=1;j<=i;j++));do echo -n $i done echo "" done read -p "按任意键继续" keyfor ((i=1;i<=9;i++));do for ((j=1;j<=i;j++));do echo -n "|" done echo "_" done read -p "按任意键继续" keyfor i in {1..10};do for ((j=1;j<=i;j++));do echo -n "*" done echo "" done for ((i=10;i>=1;i--));do for ((j=1;j<=i;j++));do echo -n "*" done echo "" done
71: 根据计算机当前时间, 返回问候语, 可以将脚本设置为开机自启 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/bin/bash tm=`date +%H`if [ $tm -le 12 ];then msg="早上好" elif [ $tm -gt 12 -a $tm -le 18 ];then msg="中午好" else msg="晚上好" if echo "当前时间是: $(date +%F-%H:%M:%S) " echo -e "\033[34m$msg \033[0m"
72: 读取用户输入的账户名称, 将账户名写入到数组保存 1 2 3 4 5 6 7 8 9 10 11 12 13 #!/bin/bash i=0while true ;do read -p "输入用户名 保存到数组:" name if [ $name == "over" ];then break else name_arr[$i ]=$name let i++ fi done echo "总账户数量为 ${#name_arr[*]} " echo "${name_arr[*]} "
73: 判断文件或目录是否存在 1 2 3 4 5 6 7 8 9 10 11 #!/bin/bash read -p "输入目录或者文件:" dirif [ -f $dir ];then echo "该文件存在" ls -l $dir elif [ -d $dir ];then echo "该目录存在" ls -ld $dir fi
74: 打印各种时间格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #!/bin/bash echo "显示星期简称(如: Sun)" date +%aecho "显示星期全程(如: sunday)" date +%Aecho "显示月份简称(如: jan)" date +%becho "显示月份全称(如: january)" date +%Becho "显示数字月份(如: 12)" date +%mecho "显示当前分钟" date +%Mecho "显示当前数字日期" date +%d
75: 使用egrep 过滤mac地址 1 2 3 4 #!/bin/bash ip a show ens33 | egrep -o "[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}"
76: 使用awk编写wc程序 1 2 3 4 5 6 7 #!/bin/bash awk '{chars+=length($0)+1;words+=NF} END{print NR,words,chars}' $1