一、Shell编程中if if ..else if..elif..elif..elsewhileuntilcase..in语句的用法

    1.if 是单分支语句,使用格式如下:

      if  condition  ; then

         statement

         …..

      fi

    2.if … else  是双分支语句,使用格式如下:

      if  condition  ;  then

          statement

          ….

       else

           statement

           ….

       fi

    3.if …elif…elif…else 是多分支语句,使用格式如下:

      if   condition ; then

           statement

           ….

      elif  condition ; then

           statement

           …..

      elif  condition ; then

           statement

           …..

            .

            .

            .

      else

           statement

           ….

      fi

  4.while 语句是循环语句,当条件满足的情况下才循环,不满足则退出循环,使用格式如下:

    while  condition  ;  do

           statement

           …..

    done

   5.until 语句也是循环语句,当条件不满足的情况下循环,满足则不循环,使用格式如下:

     until  condition ;   do

           statement

           …..

     done

  6.case 也是循环语句,使用格式如下:

    case  $var(变量)  ; in

   value1

    ……

      ;;

     value2)

     …..

     ;;

     *)

     ;;

     ..

     ..

     ..

    esac

 

   脚本练习:

      1.计算100以内所有能被3整除的正整数的和。

#!/bin/bash

 declare -i sum=0

       for I in {1..100}; do

       if [ $[$I%3] -eq 0 ]; then

       let sum+=$I

       fi

done

       echo " the sum is :$sum"                                                                                               

2.计算100以内所有奇数的和以及所有偶数的和

#!/bin/bash

# echo "exercise"

      declare -i sum1=0

      declare -i sum2=0

 for I in {1..100}; do

      if [ $[$I%2] -eq 0 ]; then

      let sum1+=$I

      else

      let sum2+=$I

fi

done

   echo " the  even sum is :$sum1"

   echo " the  oddnumber sum is :$sum2"

                                

3.判断/var/log下的文件的类型:

   如果是普通文件,则说明其为普通文件;

   如果是目录文件,则说明其为目录文件;

   如果是符号链接文件,则说明其为符号链接文件;

   否则,说明文件类型无法识别;

#!/bin/bash

 file1=/var/log/*

for file  in $file1 ; do 

if [ -f $file ]; then

   echo "$file is common file"

elif [ -d $file ]; then

  echo "$file is directory file"

else

  echo "$file is unknow"

fi

done

4.写一个脚本,分别显示当前系统上所有默认shellbash的用户和默认shell

/sbin/nologin的用户

并统计各类shell下的用户总数,显示结果形如:bash3userthey

areroot,redhat,gentoo   nologn2userthey arebinftp

#!/bin/bash

file=/etc/passwd

bsh='/bin/bash'

nobsh='/sbin/nologin'

use=`cat $file | cut -d: -f1`

declare -i d1=0

declare -i d2=0

for I in $use ; do

 s=`grep "^$I:" $file | cut -d: -f7`

 if [ "$s" = $bsh ] ; then

 let d1=$d1+1

    muser=$I\,$muser

 elif [ "$s" = $nobsh ] ; then

   let d2=$d2+1

    suser=$I\,$suser

 fi

done

echo "BASH,$d1 users ,they are:"

echo  $muser

echo

echo "NOLOGIN,$d2 users ,they are:"

echo  $suser

5.写一个脚本:

(1)如果不存在,就创建文件/tmp/maintenance;如果存在,就事先删除

(2)在文件/tmp/maintenance中添加如下内容:

172.16.0.6

172.16.0.17

172.16.0.20

(3)测试172.16.0.0/16网络内的所有主机是否在线,如果在线就显示其在线,如果此主机

/tmp/maintenance文件中,就显示其正处于维护状态;否则,就显示其状态未知;

#!/bin/bash

file=/tmp/maintenace

if [ -e $file ]; then

   rm -rf $file &> /dev/null

fi

touch $file

cat >> $file << EOF

172.16.0.6

172.16.0.17

172.16.0.20

EOF

bnet=172.16

for net in {0..254} ; do

   for host in {1..254} ; do

      if ping -c1 -W1 $bnet.$net.$host &> /dev/null ; then

         echo "$bnet.$net.$host is up."

      elif grep "$bnet.$net.$host$" $file &> /dev/null ;then

         echo "$bnet.$net.$host is under maintenance."

      else

         echo "$bnet.$net.$host state is unknow."

      fi

   done

done

6写一个脚本,完成以下功能:

(1)、提示用户输入一个用户名;

(2)、显示一个菜单给用户,形如:

U|u  show UID

G|g  show GID

S|s  show SHELL

Q|q  quit

(3)、提醒用户选择一个选项,并显示其所选择的内容;如果用户给的是一个非上述所提示的选项,则提醒用户给出的选项错误,并请其重新选择后执行;

第一种方法:

 #!/bin/bash

   read  -p "Enter a user name:" username

   ! id $username &> /dev/null && echo " Come on ,the user you input unexit" && exit 9

   cat << EOF

   U|u  show UID

   G|g  show GID

   S|s  show SHELL

   Q|q  quit

   EOF

   read -p "Enter your choice:" op

   case $op in

U|u)

id -u $username;;

   G|g)

    id -g $username;;

   S|s)

     grep "^$username\>" /etc/passwd | cut -d: -f7;;

  Q|q)

exit 8 ;;

    *)

echo "input option wrong ,quit"

  exit 9

  ;;

esac

第二种方法

   #!/bin/bash

    read -p "Enter a user name:" username

    ! id $username &> /dev/null && echo "Come on ,you input user notexit" && exit 9

    cat << EOF

    U|u  show UID

    G|g  show GID

    S|s  show SHELL

    Q|q  quit

    EOF

read -p "Enter your option:" op

    while true; do

    case $op in

    U|u)

    id -u $username

    break

    ;;

   G|g)

id -g $username

    break

    ;;

S|s)

   grep "^$username\>" /etc/passwd | cut -d: -f7

   break

   ;;

   Q|q)

   exit 7 ;;

   *)

   read -p "Wrong option,Enter a right option:" op ;;

   esac

   done

7写一个脚本:

(1)、判断一个指定的脚本是否是语法错误;如果有错误,则提醒用户键入Q或者q无视错误并退出,其它任何键可以通过vim打开这个指定的脚本;

(2)、如果用户通过vim打开编辑后保存退出时仍然有错误,则重复第1步中的内容;否则,就正常关闭退出。

第一种方法

#!/bin/bash

 [ ! -f $1 ] && echo "wrong path." && exit 2

 until bash -n $1 &> /dev/null ; do

   read -p " Q|q to quit .others to edit:" opt

   case $opt in

   Q|q)

      echo "quit..."

      exit 3

      ;; 

   *) 

    vim $1

    ;; 

    esac

done

第二种方法:

#!/bin/bash

    [ ! -f $1 ] && echo "wrong path." && echo "Quit!" && exit 9

   until bash -n $1 &> /dev/null ; do

      read -p " Grammar wrong please enter Q|q to quit .others to edit:" opt

      case $opt in

      Q|q)

         echo "quit..."

        exit 3

        ;;

     *)

      vim $1

      bash -n $1 &> /dev/null

      val=$?

      [ "$val" -ne 0 ] && echo "xiu gai bu cheng gong. "

      ;;

     esac

 done

 第三种方法

#!/bin/bash

[ ! -f $1 ] && echo "Wrong scripts." && exit 4

bash -n $1 &> /dev/null

valu=$?

until [ $valu -eq 0 ] ; do

   read -p "Q|q to quit ,others to edit:" op

 case $op in

 Q|q)

 echo "Quit."

 exit 9

  ;;

 *)

  vim $1

  bash -n $1 &> /dev/null

  valu=$?

  ;;

 esac

done

 8 写一个脚本:

查看redhat用户是否登录了系统,如果登录了,就通知当前脚本执行者“redhat

is logged on.”;否则,就睡眠5秒钟后再次进行测试;直到其登录为止退出;

第一种方法

#!/bin/bash

   who | grep "^redhat\>" &> /dev/null

   reval=$?

   until [ $reval -eq 0 ] ;do

     sleep 5

   who | grep "^redhat\>" &> /dev/null

   reval=$?

  done

  echo "redhat is logged on."

第二种方法:

#!/bin/bash

 until who | grep "^redhat\>" &> /dev/null ; do

 sleep 5

 done

echo "redhat is logged on"

9写一个脚本:

(1)、向系统中添加20个用户,名字为linuxer1-linuxer20,密码分别为其用户名,要使用while循环;

(2)、要求:在添加每个用户之前事先判断用户是否存在,如果已经存在,则不再添加此用户;

(3)、添加完成后,显示linuxer1-linuxer20每个用户名及对应的UID号码和GID号码,形如 stu1, UID: 1000, GID: 1000 

    #!/bin/bash

    declare -i I=1

    while [ $I -le 20 ] ; do

     l=linuxer$I

     let I++

    ! id $l &> /dev/null && useradd $l &> /dev/null && echo "the user:$l" | passwd --stdin $l &> /dev/null && echo "a    dd user $l successfully" || echo " The user $l is exit. "

   d=`id -u $l`

   g=`id -g $l`

   echo " $l ,UID:$d,GID:$g "

  done