【shell】训练小脚本(不定时更新)


前言

本博客内容仅为记录博主思路,仅供参考,一切以自己实践结果为准。


一、定义

写脚本,首先要有脚本基础知识,链接如下: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
#计算从1100所有整数的和

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
#使用循环语句将一个0255之间的十进制数转换成二进制数

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 数组/流编辑器

五、结语

总结:想要学得好,唯有多敲多练,最开始的时候就是抄脚本,后期可根据需求独立盲写脚本。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪碧不要气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值