前言
本博客内容仅为记录博主思路,仅供参考,一切以自己实践结果为准。
一、定义
写脚本,首先要有脚本基础知识,链接如下:shell脚本基础语句、函数知识
从易到难,熟悉shell脚本的语句、函数,只是看懂是没用的,要多敲多练,看懂了和会写了是两码事
会写了之后要盲写(只看要求,自己完成所有代码);题目是同一个,但解题过程是多样的,有自己的思路,这才是理解了
理解之后就要注意脚本的格式(缩进、注释等),让人一目了然才是好脚本
二、第一部分
2.1 if/case判断语句
2.1.1 if 判断检查文件
#!/bin/bash
#作用:检查用户家目录中的 test.sh 文件是否存在,并且检查是否有执行权限
test -f $HOME/test.sh
#利用test测试文件是否存在,利用预定义变量$HOME代指家目录写出绝对路径
a=`echo $?`
if [ $a -eq 0 ];then
#判断test命令是否执行成功,若成功则返回值为0,不成功则返回值为非0
echo "文件存在"
test -x $HOME/test.sh
#文件存在,则可以测试文件是否有执行权限
b=`echo $?`
if [ $b -eq 0 ];then
echo "文件可执行"
else
echo "文件不可执行"
fi
else
#若文件不存在,则直接输出下方命令
echo "文件不存在"
fi
2.1.2 if 整数判断
#!/bin/bash
#判断输入的数字是否为整数并判断是奇数或者偶数
read -p "请输入数字:" a
#通过标准输入给变量a赋值
if [ $(echo $a/1|bc) -eq $a ];then
#因为bc能进行小数预算,因此$a/1通过bc运算后,得到的是一个整数
echo "${a}是整数"
if [ $a -gt 0 ] && [ $(($a%2)) -eq 0 ];then
#若$a是整数,则可通过对2取余判断,若余数为0则为偶数,余数为1则为奇数(数字要限定为正整数)
echo "${a}是偶数"
elif [ $a -gt 0 ] && [ $(($a%2)) -ne 0 ];then
echo "${a}是奇数"
else
echo "${a}非奇非偶"
fi
else
echo "${a}不是整数"
fi
2.1.3 case判断解压文件
#/bin/bash
#作用:用case语句解压根据后缀名为 .tar.gz 或 .tar.bz2 的压缩包到 /opt 目录
case $1 in
#通过位置变量比较复合条件,根据复合条件进入对应语句
*.tar.gz)
tar xf $1 -C /opt
;;
*.tar.bz2)
tar xf $1 -C /opt
;;
*)
#若所有语句都不符合,则进入该语句
echo "改文件不是压缩文件"
esac
2.1.4 case设置firewalld开机自启
#!/bin/bash
#用case语句在/etc/init.d/目录中写一个firewalld脚本,并加入到系统服务管理中(#chkconfig: 2345 99 20);使能够使用 service firewalld start|stop|restart|status 来管理firewalld服务,要求如果命令选项不对,则提示 “用法: $0 {start|stop|status|restart}”
#该文件创建在/etc/init.d/目录中,文件名为firewalld
#chkconfig: 2345 99 20
case $1 in
start)
echo "正在开启防火墙"
systemctl start firewalld
;;
stop)
echo "正在关闭防火墙"
systemctl stop firewalld
;;
restart)
echo "正在重启防火墙"
systemctl restart firewalld
;;
status)
echo "正在查看防火墙状态"
systemctl status firewalld
;;
*)
echo "用法: $0 {start|stop|status|restart}"
bash $0
esac
2.2 for/while/until循环
2.2.1 for循环求和
#!/bin/bash
#计算从1到100所有整数的和
sum=0
for((i=1;i<=100;i++))
do
let sum+=$i
done
echo "1-100和为$sum"
2.2.2 for循环检测主机状态
#!/bin/bash
#检测指定范围主机是否通信,并将通信的主机ip输出到文件host_ip中
a="192.168.13"
b=`echo $a.{1..255}`
for i in $b
do
{
ping -c2 -W1 ${i} &>/dev/null
if [ $? -eq 0 ]; then
echo "主机${i}通畅" >>up
else
echo "主机${i}不通畅" >>down
fi
}&
done
wait
2.2.3 while循环判断跑步晋级
#!/bin/bash
#作用:提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,如果输入其它字符则提示重新输入;进入选拔赛的成员再进一步判断男女性别,男生进男生组,女生进女生组,如果输入错误请提示错误
read -p "请输出该同学100米短跑成绩:" a
#read -p:通过标准输入交互后,将输入值赋予变量a
while true
#while:判断条件为真时则执行循环,true表示一直为真,若是不利用命令退出,则会形成死循环
do
if [ $a -gt 0 ] && [ $a -le 10 ];then
#判断a是否为合格成绩:0<a<10,合格则进入嵌套判断,不合格则执行另外的判断条件
read -p "请输入该同学的性别(男/女):" b
if [ "$b" == "男" ] ;then
echo "该同学成绩为${a}秒,已通过预选,现被分配到男子组"
exit
#退出脚本(无论下方有多少命令,都不再执行,直接关闭脚本)
elif [ "$b" == "女" ];then
echo "该同学成绩为${a}秒,已通过预选,现被分配到女子组"
exit
else
read -p "性别输入错误,请重新输入:" b
fi
elif [ $a -gt 10 ];then
#若a>10则成绩不合格,会被告知已淘汰
echo "很遗憾,该同学未通过预选赛"
exit
else
#不符合以上任何判断的情况,则进入该语句
read -p "请输入正确的成绩:" a
#进行标准输入,为变量a重新赋值,虽然再次进行循环判断
fi
done
2.2.4 if判断加for循环求和
#!/bin/bash
#计算从1到任意正整数的和
read -p "请输入一个正整数:" num
sum=0
if expr $num+1 &>/dev/null;then
for((i=1;i<=${num};i++))
do
let sum+=$i
done
else
echo "输入的不是正整数,请重新输入"
bash $0
fi
echo "1-100和为$sum"
2.2.5 if判断for循环批量创建用户
#!/bin/bash
#作用:用户名存放在users.txt文件中,每行一个,判断文件里的用户是否存在;若该用户存在,输出提示该用户已存在;若该用户不存在,提示用户输入密码,建立用户并设立其密码
a=`cat user.txt`
for i in $a
do
b=`grep $i /etc/passwd | awk -F: '{print $1}'`
if [ "$b" == "$i" ];then
echo "用户${i}已存在"
else
useradd $i
read -p "请为用户${i}设置密码:" c
echo $c | passwd --stdin $i
fi
done
三、第二部分
3.1 数据切片/进制转换
3.1.1 随机数+切片+循环生成随机密码
#!/bin/bash
#生成六位随机密码(范围大小写字母+数字)
i=1
a="abcdefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890"
while [ $i -le 6 ]
do
b=$[RANDOM% ${#a}]
c=${a:b:1}
d+=$c
let i++
done
echo "本次生成随机密码为:"$d
3.1.2 取余+判断+循环转换进制
#/bin/bash
#使用循环语句将一个0到255之间的十进制数转换成二进制数
read -p '请输入你要转换的数:' a
f=$a
i=1
while [ $i -le 8 ]
do
b=$[$a%2]
a=$[$a/2]
if [ $b -eq 1 ];then
c=1$c
let i++
elif [ $b -eq 0 ];then
c=0$c
let i++
fi
done
echo "${f}的二进制是:$c"
bash $0
3.1.3 传参+循环+判断拆分文件
#!/bin/bash
#将一个100行文件拆分为两个50行的文件
i=1
echo "$(seq 1 100)" > test.txt
cat test.txt |while read a
do
if [ $i -le 50 ];then
echo "$a" >> q50.txt
let i++
elif [ $i -ge 50 ];then
echo "$a" >> h50.txt
let i++
fi
done
3.1.4 提取+循环+判断转换IP地址进制
#!/bin/bash
#将十进制IP地址转移为二进制IP地址
ip="192.168.13.20"
a=`echo $ip|awk -F. '{print $1}'`
b=`echo $ip|awk -F. '{print $2}'`
c=`echo $ip|awk -F. '{print $3}'`
d=`echo $ip|awk -F. '{print $4}'`
i=1
for e in {$a $b $c $d}
do
while [ $i -le 8 ]
do
f=$[$e%2]
e=$[$e/2]
if [ $f -eq 1 ];then
g=1$g
let i++
elif [ $f -eq 0 ];then
g=0$g
let i++
fi
sum+=$sum
done
done
echo "${ip}的二进制是:$sum"
3.1.5 递归显示目录
四、第三部分
4.1 数组/流编辑器
五、结语
总结:想要学得好,唯有多敲多练,最开始的时候就是抄脚本,后期可根据需求独立盲写脚本。