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==9{print $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 ‘BEGIN{FS=" +|/"}{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]++}END{for (i in h) print i,h[i]}‘
www.sina.com 13
www.qq.com 7
www.taobao.com 25

原文地址:https://www.cnblogs.com/sgy-blin/p/10957218.html

时间: 2024-10-14 18:47:00

shell脚本——日常练手的相关文章

小黑的日常折腾-网段在线地址扫描shell脚本

学习Linux已经一个月了,不知不觉shell脚本的基本用法已经学习完了,为了检验自己的学习情况,在清明小长假期间花了点时间折腾出了这个脚本.该作品只是练手之作,如果有BUG,请留言指明,我会尽力完善. 该脚本需要用户给定两个参数,第一个参数是网段的起始ip地址,第二个参数是网段的结束ip地址.起始地址的ip地址最后一段必须是1,如192.168.0.1,结束ip地址的最后一位必须是254,如192.168.10.254.另外,起始和结束ip地址的第一段必须相同. 注意: 1.地址范围越大运行程

手游公司运维之利用Rundeck自动化运维工具和Shell脚本构建测试环境代码发布平台和生产环境代码发布平台

在做手游运维工作之前,我接触的代码发布都是常规的软件发布,有固定的发布周期.之前工作的那个外企有严格的发布周期,一年中的所有发布计划都是由Release Manager来控制,每次发布之前都需要做一些准备工作,如填写发布表单,上传发布需要的资源文件,联系发布过程中的相关人员,如开发和测试.最后在公司内部开发的发布平台上按照指定的时间点击鼠标对一个集群内的几台主机或全部主机进行代码发布.这个发布平台还是基于rsync服务实现的.虽然每个星期都有各种服务的发布,但是整个发布流程是可以控制的,并且发布

日常使用的shell脚本

1.shell实现无密码登陆 host=$1 expect << EOF         spawn ssh-copy-id $host         expect "password:"         send "123456\r" expect eof EOF 2.一个节点分类的shell脚本 network="eth0" host1=`uname -n` base=`uname -n|cut -c 1-3` id1=`una

利用shell脚本实现计划任务功能 V1.2

2013.05.10  mytask 1.2 主程序休眠时间分成若干小的时间片断分段休眠,避免长时间的休眠不能及时响应系统信号. 2013.05.07 mytask 1.1 昨天发布了mytask1.0 版后(利用shell脚本实现计划任务功能),一直在想着如何解决那个最后的遗留问题"每个任务脚本中声明的函数名必须唯一不能重复,否则会导致任务函数覆盖.",无意间自问了一句为什么不能像crontab那样直接调用脚本和命令呢?这一问才让自己回忆起来,之所以用function封装任务是因为早

Python之路【第二十四篇】:Python学习路径及练手项目合集

Python学习路径及练手项目合集 Wayne Shi· 2 个月前 参照:https://zhuanlan.zhihu.com/p/23561159 更多文章欢迎关注专栏:学习编程. 本系列Python技术路径中包含入门知识.Python基础.Web框架.基础项目.网络编程.数据与计算.综合项目七个模块.路径中的教程将带你逐步深入,学会如何使用 Python 实现一个博客,桌面词典,微信机器人或网络安全软件等.完成本路径的基础及项目练习,将具备独立的Python开发能力. 完整的Python学

shell脚本——翻译英文单词

近来在学习linux跟shell脚本.英文又多年不用还给教师了.遇到不懂的单词都要开个词霸网页词典来翻译,久了多有不爽.偶然找到http://www.iteye.com/topic/819440中提到一个翻译英文单词的shell脚本,可惜是多年以前的,并且用的还是如今被墙的谷歌,当然失效了. translate() {       wget -qO- "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=

linux运维学习shell脚本监控nginx服务

菜鸟学习shell脚本后,动手练手简单小实验,使用shell脚本判断nginx是否正常运行,如果没有运行将nginx服务启动起来. 一.基于进程判断 1.获取nginx进程来判断该服务是否正常启动. ps -ef | grep nginx | grep -v grep | wc -l    输出进程行数 然后判断是否为2 如果不是说明该服务没有启动. grep -v grep  用来排除掉您所使用grep产生的进程. 2.shell 脚本编写 先定义一个变量Web #!/bin/bash Web

粗浅的增量代码上线shell脚本--菜鸟版

1      说明 这个shell脚本是是我编写的第一代版本的增量代码上线脚本,现在代码上线脚本已更新了几个版本,关注的技术重点是可视化对代码版本任意回滚的上线系统(python语言编写),后期将逐步分享这些脚本^_^ .虽然现在看来,这个脚本写的惨不忍睹,但是在当时却改变了公司的上线方式,从交接工作时的手动上线,改变为脚本自动化上线,也算是一个起点和转折点. 2      模块分析 这个上线脚本功能比较简单,先请看上线总体流程: 以下是详细的上线流程图: 3      代码部分 请使用"not

70个Python练手项目

前言: 不管学习那门语言都希望能做出实际的东西来,这个实际的东西当然就是项目啦,不用多说大家都知道学编程语言一定要做项目才行. 这里整理了70个Python实战项目列表,都有完整且详细的教程,你可以从中选择自己想做的项目进行参考学习练手,你也可以从中寻找灵感去做自己的项目. 70个Python项目列表: 1.[Python 图片转字符画]2.[200行Python代码实现2048]3.[Python3 实现火车票查询工具]4.[高德API+Python解决租房问题 ]5.[Python3 色情图