shell脚本——日常练手
Posted sgy-blin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本——日常练手相关的知识,希望对你有一定的参考价值。
1、猜数小游戏
关键点:命令写法
1、$RANDOM 的使用格式
2、反引号 用于执行命令
3、let 整数自加1的用法
4、引用局部变量,$ 格式
5、elif 后面也要跟 ;then
#!/bin/bash #*************猜数游戏************* i=0 #记录猜数次数 num2=`echo $RANDOM | cut -c 1-2` #目标数指定随机值 while true #死循环 do read -p "请输入两位整数:" num1 #输入竞猜初始值 if [ $num1 -gt $num2 ];then #如果猜的比目标数大 echo "比 $num1 小" #提示输入值偏大 let i++ #猜错次数加1 elif [ $num1 -lt $num2 ];then #如果猜的比目标数小 echo "比 $num1 大" #提示输入值偏小 let i++ #猜错次数加1 else echo "猜对了:就是 $num2 " #输出猜对的结果 echo "一共猜错了 $i 次 " #输出猜错次数 break #跳出循环 fi done
2、局域网检查上线ip并保存在线ip
关键点:美观度调整方法
1、调用内部文件方法 .[空格]
2、echo -n 不空行输出
3、"黑洞文件" /dev/null 该目录存放条件判断结果,不会呈现给用户,使输出简洁
4、使用 nohup bash ping_ip.sh & 屏蔽ping的过程 ("&"指在后台运行 "nohup"指关闭终端仍继续运行)
可使用 ps aux | grep "ping_ip.sh" 过滤出来后,使用kill -9 终止
#!/bin/bash #*********************检测同网段中ip********************** . /etc/init.d/functions #调用内部文件 ip=192.168.9. #指定网段 for i in `seq 1 255` #截取从1~255的ip do if ping -c 1 -w 1 $ip$i &>/dev/null ;then #ping ip反馈信息写入黑洞文件 echo -n "$ip$i" #打印ip success #使用functions函数,美观展示 echo "" echo "$ip$i">>/root/bash/ping_ip.txt #将在线ip输出至文档 #echo "$ip$i 在线" else echo -n "$ip$i" #打印ip failure #使用functions函数,美观展示 echo "" #echo "$ip$i 不在线" fi done
3、打印九九乘法表
关键点:嵌套
1、注意嵌套缩进
#!/bin/bash #**********************九九乘法表***************** for i in `seq 1 9` #取数字1~9 do for j in `seq $i 9` #取数字从i~9 do echo -n " $i * $j = $((i*j)) " #相乘不换行 done echo -e "\\n" #第一个因数改变后换行 done
4、批量创建用户并设置8位加密密码,可登陆
关键点:
1、加密方法——key=`echo $RANDOM | md5sum | cut -c 1-8`
2、账号密码匹配——echo "$key | passwd --stdin user$i"
#!/bin/bash #********************批量创建用户并设置随机登录密码******************* for i in `seq 1 100` #取数1~100 do useradd user$i #批量建立用户user1~user100 key=`echo $RANDOM|md5sum|cut -c 1-8` #制作加密密码 echo $key|passwd --stdin user$i #账号密码匹配 echo -e "账号:user$i \\n密码:$key" >> /root/bash/passwd_100.txt #将生成的账户密码写入文件保存 done
5、重启服务
关键点:
1、shell变量 $? 可以反馈上一步命令执行状况
#!/bin/bash systemctl restart network #重启网卡 if [ "$?" == 0 ];then #判断前一步是否执行成功 echo "成功重启" else echo "失败" fi
6、一键部署NFS客户端、服务器端
关键点:
1、服务器端和客户端各编辑一个shell脚本,两个脚本的运行通过ssh免密远程登录实现
- 服务器端脚本
#!/bin/bash read -p "请输入客户端ip地址:" ip #共享至客户端ip read -p "请输入服务端共享文件绝对路径:" dir1 #共享的文件 yum install nfs-utils rpcbind -y #下载nfs服务及其依赖rpcbind if [ -e "$dir1" ];then #判断共享文件是否存在 chown -R nfsnobody: $dir1 #如果存在,更改属主为nfsnobody else mkdir $dir1 #如果不存在,创建一个共享目录 chown -R nfsnobody: $dir1 #更改属主为nfsnobody fi echo "$dir1 $ip/24(rw)">>/etc/exports #编辑配置文件 systemctl restart nfs rpcbind #重启服务端nfs和依赖rpcbind if [ $? == 0 ];then #检测服务端nfs服务是否部署成功 echo "服务器端nfs部署成功" ssh-keygen #生成登录密钥 echo "******请输入$ip的密码*********" ssh-copy-id $ip #传输公钥 if [ $? == 0 ];then #检测公钥是否传输成功 echo "免密登录成功" ssh $ip #登录客户端 else echo "客户端登录失败" fi else echo "服务器端nfs部署失败" fi
- 客户端脚本
#!/bin/bash read -p "请输入服务端的ip地址:" ip read -p "请输入服务端共享文件绝对路径:" dir1 read -p "请输入客户端共享文件挂载的绝对路径:" dir2 yum install nfs-utils -y #下载客户端nfs服务 showmount -e $ip #查看共享文件 if [ $? == 0 ];then #nfs服务是否下载成功 if [ -e "$dir2" ];then #如果挂载点存在,直接挂载并查看 mount -t nfs $ip:$dir1 $dir2 df -h else #如果挂载点不存在,创建挂载点并挂载查看 mkdir $dir2 mount -t nfs $ip:$dir1 $dir2 df -h fi echo "客户端挂载成功" else echo "服务端共享文件接收失败" fi
[[email protected] bash]# bash nfs.sh
请输入客户端ip地址:192.168.160.130
请输入服务端共享文件绝对路径:/root/nfs
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
软件包 1:nfs-utils-1.3.0-0.61.el7.x86_64 已安装并且是最新版本
软件包 rpcbind-0.2.0-47.el7.x86_64 已安装并且是最新版本
无须任何处理
服务器端nfs部署成功
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
/root/.ssh/id_rsa already exists.
Overwrite (y/n)?
******请输入192.168.160.130的密码*********
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
免密登录成功
Last login: Sun Jun 2 03:56:38 2019 from 192.168.160.99[[email protected] ~]# ls
anaconda-ks.cfg bash lv_sgy
[[email protected] ~]# cd bash/
[[email protected] bash]# bash nfs.sh
请输入服务端的ip地址:192.168.160.99
请输入服务端共享文件绝对路径:/root/nfs
请输入客户端共享文件挂载的绝对路径:/root/nfs_server
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
软件包 1:nfs-utils-1.3.0-0.61.el7.x86_64 已安装并且是最新版本
无须任何处理
Export list for 192.168.160.99:
/root/nfs 192.168.160.130/24
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/cl-root 17G 1.3G 16G 8% /
devtmpfs 478M 0 478M 0% /dev
tmpfs 489M 0 489M 0% /dev/shm
tmpfs 489M 13M 476M 3% /run
tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda1 1014M 139M 876M 14% /boot
/dev/sr0 4.1G 4.1G 0 100% /mnt
tmpfs 98M 0 98M 0% /run/user/0
192.168.160.99:/root/nfs 17G 4.9G 13G 29% /root/nfs_server
客户端挂载成功
[[email protected] bash]#[[email protected] bash]# cd
[[email protected] ~]# ls
anaconda-ks.cfg bash lv_sgy nfs_server
[[email protected] ~]# touch ./nfs_server/a.txt
[[email protected] ~]# cd nfs_server/
[[email protected] nfs_server]# ls
a.txt
[[email protected] nfs_server]#[[email protected] nfs_server]# exit
登出
Connection to 192.168.160.130 closed.
[[email protected] bash]# cd
[[email protected] ~]# ls
bash nfs 公共 模板 视频 图片 文档 下载 音乐 桌面
[[email protected] ~]# ll nfs
总用量 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 6月 2 16:45 a.txt
[[email protected] ~]#
7、统计以.sh结尾的文件总大小,以kb为单位
关键点:
1、在cut时会出现部分不显示,但遍历之后不会有影响
#!/bin/bash sum=0 for i in `find /root -type f -a -name "*.sh"` do size=`ls -l $i | cut -d " " -f 5` let sum+=size done echo "总大小为$(($sum/1024))kb"
8、查找含某个关键词的文件
关键点:
1、grep -r 递归查询
2、grep -l 返回目录
[[email protected] bash]# find /usr/share/doc -type f |xargs grep -rl "sgy"
/usr/share/doc/libxslt-1.1.28/ChangeLog.gz
/usr/share/doc/libusal-1.1.11/Changelog
/usr/share/doc/opus-1.0.2/rfc6716.txt
grep: /usr/share/doc/python-setuptools-0.9.8/CHANGES: 没有那个文件或目录
grep: (links).txt: 没有那个文件或目录
/usr/share/doc/gcc-4.8.5/ChangeLog-2006.bz2
/usr/share/doc/yelp-3.14.2/NEWS
/usr/share/doc/gnome-packagekit-common-3.14.3/NEWS
/usr/share/doc/file-roller-3.14.2/NEWS
/usr/share/doc/gnome-software-3.14.7/NEWS
/usr/share/doc/gnome-system-monitor-3.14.1/NEWS
/usr/share/doc/wodim-1.1.11/Changelog
grep: /usr/share/doc/stix-fonts-1.1.0/STIX: 没有那个文件或目录
grep: Font: 没有那个文件或目录
grep: License: 没有那个文件或目录
grep: 2010.pdf: 没有那个文件或目录
#!/bin/bash read -p "输入想要查找的文件关键词:" key for i in `find /root -type f` do if cat "$i" | grep "$key" &>/dev/null;then echo "$i" sleep 1 fi done
9、大于100K的文件保存其他位置
关键点:
1、单位默认是K
#!/bin/bash for i in `find /root -size +100 -a -type f` do mv $i /tmp done
10、参数相加
关键点:
1、$*的使用,表示所有参数($# 是统计参数个数)
#!/bin/bash sum=0 for i in $* do let sum+=i done echo "$sum" ~
11、ip截取
#!/bin/bash cat /etc/sysconfig/network-scripts/ifcfg-ens33 |grep "IP"| cut -d "=" -f 2 ip a|grep "ens33"|grep "inet"|tr -d " "|cut -d "/" -f 1|cut -d "t" -f 2 ip a | awk -F " " ‘NR==9print $2‘ | awk -F "/" ‘print $1‘ ip a |awk ‘$NF~/^ens33/‘|awk -F " " ‘print $2‘|awk -F "/" ‘print $1‘ ip a | sed -n ‘/ens33$/p‘|awk -F " " ‘print $2‘| awk -F "/" ‘print $1‘ ip a | sed -n ‘/ens33$/p‘|awk -F " +|/" ‘print $3‘ ip a | sed -n ‘/ens33$/p‘|awk ‘BEGINFS=" +|/"print $3‘
[[email protected] bash]# bash ip_grep.sh 192.168.160.99 192.168.160.99 192.168.160.99 192.168.160.99 192.168.160.99 192.168.160.99 192.168.160.99
12、域名统计
[[email protected] ~]# cat test http://www.qq.com/ken http://www.qq.com/ken http://www.qq.com/ken http://www.qq.com/ken http://www.qq.com/ken http://www.qq.com/ken http://www.qq.com/ken http://www.sina.com/ken http://www.sina.com/ken http://www.sina.com/ken http://www.sina.com/ken http://www.sina.com/ken http://www.sina.com/ken http://www.sina.com/ken http://www.sina.com/ken http://www.sina.com/ken http://www.sina.com/ken http://www.sina.com/ken http://www.sina.com/ken http://www.sina.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken http://www.taobao.com/ken
[[email protected] ~]# cat test | awk -F ‘/+‘ ‘print $2‘ | sort | uniq -c 7 www.qq.com 13 www.sina.com 25 www.taobao.com
[[email protected] ~]# cat test | awk -F ‘/+‘ ‘h[$2]++ENDfor (i in h) print i,h[i]‘ www.sina.com 13 www.qq.com 7 www.taobao.com 25
以上是关于shell脚本——日常练手的主要内容,如果未能解决你的问题,请参考以下文章