Day 4 shell脚本

2019-04-06   16:56:09

涉及编程,if判断, 脚本传参,for , while循环等,不太会写。

测试日常用的少,运维用得多。了解即可。

 

 一、    引用变量

         $name   或 $(name)

二、    条件判断

         整数测试:

               -gt  :是否大于  (条件成立则输出0 ,否则为1)

               -ge  :是否大于等于

                -lt:是否小于

                -le:是否小于等于

                -eq:是否等于

                -ne:是否不等于

  

         文件测试:测试文件的存在性以及属性测试

 

           -e  $file:是否存在   eg#[-e /etc/文件名]  ,存在为真,否则为假

 

           -f  $file:文件是否为普通文件

 

           -d 文件是否为目录

 

           -h 是否存在且为符合链接文件 -----/dev

 

           -b 是否存在且为块设备文件   -----/dev

 

           -s 是否存在且为套接文件     -----/var/lib/mysql/mysql.sock

 

           -p 是否存在且为管道文件  

 

 

 

           -r 当前用户对文件是否有读权限

 

           -w 当前用户对文件是否有写权限

 

           -x 当前用户对文件是否有执行权限

 

 

 

           注意:所有指令前!,表示该指令的反向功能

 

           执行脚本的命令:bash   sh  ./

三、if 语句  

格式:单分支:

                if 条件;then

                  分支

                fi

           多分支:

                if 条件;then

                  分支

                else

                  分支

                ....

                fi

eg1:用户不存在则创建用户

username=lianyou

if ! id $username &>/dev/null;then

     useradd $username

   echo 123456 |passwd --stdin $username

   echo "$username:创建成功"

fi

 

eg2:如果用户存在则显示该用户,否则创建该用户

#!/bin/bash

username=xiaotangtang

if id $username &>/dev/null;then

   echo "$username:该用户已经存在"

else

   useradd $username

   echo 123456 |passwd --stdin $username

   echo "$username:用户创建OK"

fi

 

练习3:如果某路径不存在(chenyan/kj/skjd/akdsjh),则将其创建为目录:否则显示其存在,并显示其类型(file指令获取文件类型)

#!/bin/bash

filename=/duoceshi19/a/b/c/d

if [ -e $filename ];then

  echo "$filename:存在"

  file $filename            #file获取文件类型

else

  mkdir -p $filename

  echo "$filename:创建成功"

fi

 

四、脚本传参

  ./file.sh  /etc/passwd    /etc/passwd  .......

     $0          $1                $2            $n

eg4:判断脚本传入的第一个位置参数$1是否为文件,如果是文件则统计文件行数,否则显示文件不存在或不是一个文件

#!/bin/bash

if [ $# -lt 1 ];then

   echo "请传递一个参数"

   exit 1

fi

if [ -f $1 ];then

   nl $1

else

 echo "你传入的是什么啊!!!"

fi

 

练习5:通过脚本参数传递一个文件路径给脚本,判断其类型?

if [ $# -lt 1 ];then

   echo "必须给一个参数"

   exit 1

fi

if [ -f $1 ];then

  echo "这是个文件"

elif [ -d $1 ];then

  echo "这是个目录"

elif [ -h $1 ];then

  echo "这是个符号链接"

elif [ -b $1 ];then

  echo "这是个块设备文件"

else

  echo "输入的是啥啊!我不认识"

fi

 

除了脚本参数其次还可以用与用户交互的方式:

例子6:讲解read命令,体现与用户交互(通过键盘输入一个用户)

       read命令:read 命令从标准输入中读取一行

 

用户忘记输入一个用户,则给用户一个默认值,如果第二次不给值,则脚本将显示用户存在(第一次创建过);这时必须我们输入了个新用户;

#!/bin/bash

read -p "请输入一个用户:" -t 5 username

if [ -z $username ];then

   username=uuuuu

fi

if id $username &>/dev/null;then

   echo "$username:存在"

else

   useradd $username

   echo 123456 |passwd --stdin $username

   echo "$username:ok"

fi

 

练习7:写一脚本能接受任意输入两数进行大小比较?(考虑输入的两个数是相等的)

#!/bin/bash

read -p "请输入两个数:" -t 5 numb1 numb2

if [ -z $numb1 ];then

   echo "输入两个数"

   exit 1

fi

if [ -z $numb2 ];then

   echo "必须输入两个数"

   exit 1

fi

if [ $numb1 -lt $numb2 ];then

   echo "max is $numb2,min is $numb1"

else

   echo "max is $numb1,min is $numb2"

fi

 

五、for循环,while循环,算术运算

循环语句

    循环的关键就是生成列表

           列表生成方式:1for i in {1..10}

                         2seq 1 10

                         3seq 1 2 10 :生成奇数列表

                         4seq 0 2 10:  生成偶数列表

 

eg81.给系统添加10个用户,如果存在则提示用户存在,否则创建10个用户?(user1-user10

#!/bin/bash

for i in {1..10};do   ---------------for i in $(seq 1..10)

 if id user$i &>/dev/null;then

    echo "user$i exists"

 else

    useradd user$i

    echo "$i:ok"

 fi

done

 

eg91.删除刚刚创建好好的10个用户?(user1-user10

#!/bin/bash

for i in {1..10};do

 if id user$i &>/dev/null;then

    cd /usr/sbin

    ./userdel -r user$i

 fi

done

 

算术运算

  shell中,‘let’可以进行数值的加减乘除等运算操作,一般用于流程控制结构或者执行需要的运算,

  注意let只能执行整数的相关操作,运算结果也只能保存整数。

 

运算表示:$[$a+$b]     $(($a+$b))

 

eg10:求1100的整数之和

#!/bin/bash

declare -i sum=0

for i in {1..100};do

  sum=$[$sum+$i]

done

echo $sum

 

eg11:如果求1-100奇数之和

#!/bin/bash

declare -i sum=0

for i in $(seq 1 2 100);do

  sum=$[$sum+$i]

done

echo $sum

 

while循环:----用控制变量来控制

    while 条件;do

       循环体

    done

   

    进入while循环:当“条件”为真时进入

    退出while条件:当“条件”为假时退出

 

eg12:求1100的整数之和

#!/bin/bash

declare -i sum=0

declare -i i=0

while [ $i -le 100 ];do

    let sum=$[$sum+$i]

    let i++

done

echo "sum:$sum"

 

练习13:打印九九乘法表

#!/bin/bash

declare -i i=1

declare -i j=1

while [ $j -le 9 ];do

  while [ $i -le $j ];do

   echo -e -n "${i}X${j}=$[ $i*$j ]\t"    #-e:处理字符   -n:不换行输出  \t:制表符

        let i++

  done

  echo

  let i=1

  let j++

done

 

while之死循环

    格式

       while truedo

          if 条件;then

             break

          fi

       done

 

eg14:每隔三秒查看当前系统是否有chenyandan用户登入;如果登入了则显示该用户登入,如果未登入,仍然显示未登入,并显示已经是多少次查看登入情况

#!/bin/bash

username=$1

declare -i count=0

while true;do

 if who |grep "^$username";then

    echo "$username: login"

 

    break

 else

    let count++

    echo "$count:$username:not login"

 fi

sleep 3

done

 

作业题:(未完成)

 

posted @ 2019-04-06 18:05  天天天蓝蓝调调  阅读(196)  评论(0编辑  收藏  举报