shell流程控制  ( if  结构     循环结构    分支结构)
                       控制脚本的执行过程
                       流程控制彼此可以互相嵌套使用,也可以自己嵌套自己
                       根据条件的条件判断结果执行
-----------------------------------------------------
if结构

单分支

if  条件判断;then
    执行的代码
    ......
fi

if  条件判断
then
    执行的代码
    ......
fi
----------------------------------------
双分支

if  条件判断;then
       代码
       ......
else
       代码
       ......
fi
--------------------------------------------------------------------
#!/bin/bash
read -p "请输入你要查找的用户名 "  username
echo $username

if [ -n "$username" ];then
  id  $username &> /dev/null
  if [ $? -eq 0 ];then
    echo "用户已经存在"
  else
    #usd $username
    useradd  $username
    echo $username  | passwd --stdin $username &> /dev/null
  fi
else
  echo "你必须要输入检查的用户名"
fi
----------------------------------------
多分支
if  条件判断1;then
    代码
    .......
elif   条件判断2;then
     代码
    .......

elif   条件判断N;then
       代码
       .......
else
      以上所有判断条件都不成立时执行的代码
fi
______________________________________________________________________

[   -e   /media/cdrom ]   ||     mkdir   /media/cdrom

----------------------------------------------------------------------
vim ping.sh
#!/bin/bash
if [   -n "$1"   ];then
  ping  -c  3   $1  &>  /dev/null
  if  [ $?  -eq   0  ];then
      echo  "主机  $1  在线"
  else
      echo  "主机  $1  不在线"
  fi
else
  echo "执行脚本格式如下:"
  echo "$0   ip地址"
fi
:wq

chmod  +x   ping.sh
./ping.sh   1.1.1.1

----------------------------------------------------------------------
根据输入的分数,判断成绩优劣
86~100  好
85-71     优秀
70-61     良好
60分       及格
小于60    补考
小于50分 留级

要考虑的问题:
不输入成绩怎么办?
 
成绩的分数范围只能在1-100之间  输人成绩时,超出成绩的访问怎么办?

输入的不是分数 是字母 怎么办?
----------------------------------------------------------------------
循环结构  (脚本中需要重复执行的代码,放在循环结构里执行)
                添加100个系统用户
                检查网段内不在线的主机192.168.1.0/24   
  $name

for 循环结构    (遍历数据)

for   变量名  in    值列表
do
       循环体
done

for    x   in    jim    120   lucy   a
do
      echo  "plj"
done

 

造数工具   seq   15
                 seq   11    37
                 seq   10  2  28

                 {1..100}
                 {a..z}
 --------------------------------------------------------------------
执行脚本是依次检查当前系统 这4个服务器的运行状态
httpd    crond     network   atd 
若服务没有运行 启动服务,若服务是运行着的,显示服务正则运行。


for  sername  in   httpd  crond  network  atd
do
      service   $sername   status

read  -p   "请输入你的成绩   "   x
if   [  $x  -lt   60     ] ;then
       echo  "补考"
elif   [  $x   -eq   60   ];then
       echo  "及格"
elif  [ $x   -gt   60    -a   $x  -le   70   ];then
       echo  "良好"
elif  [ $x   -ge   71    -a   $x  -le   85   ];then
       echo  "优秀"
elif  [ $x   -ge   86    -a   $x  -le   100   ];then
       echo  "好"
else
       echo  "成绩的有效范围是1~100"
fi

----------------------------------------------------------------------
循环结构
C-for  结构

>   >=     <     <=

for  ((初始化;条件判断;步长))
do
     循环体
done


for  ((x=1;x<=5;x++))
do
     echo  $x
done

----------------------------------------------------------------------
while  循环结构


while   条件判断
do
      循环体
done
---------------------------------------------------
#/bin/bash
#正序输出数字1-5
i=1
while   [  $i  -le  5  ]
do
     echo -n  "  $i  "
     let  i++
done
echo
-----------------------------------------------------
#!/bin/bash
#倒序输出数字1-5
i=5
while   [   $i   -ge   1   ]
do
     echo  -n  "  $i  "
     #i=`expr  $i - 1`
     let  i--
done
echo 
--------------------------------------------------------
until 循环结构   (条件判断 不成立时执行循环体)

until   条件判断
do
      循环体
done

使用until循环结构 正序输出数字1-5

1 2 3 4 5  正序


5 4 3 2 1  倒序
i=5
until   [   $i    -lt   1 ]
do
     echo  $i
      let  i--
done
---------------------------------------------------------------------
在脚本four.sh里分别使用 for     c-for   while    until  循环结构 倒序输出数字 1-5

echo   --------------for-----------
for    i   in    5  4   3  2   1
do
       echo  -n   "  $i  "
done
echo
echo $i

echo ---------------c-for -------------
for   ((i=5;i>=1;i--))
do
         echo  -n  "  $i  "
done
echo
echo $i
echo  ------------------while----------------
i=5
while  [  $i   -ge   1  ]
do
      echo  -n  "  $i  "
     let  i--
done
echo
echo $i
echo  -------------------until--------------------
i=5
until  [  $i   -lt   1   ]
do
     echo  -n  "  $i  "
     let  i--
done
echo

----------------------------------------------------------------------
case  分支结构   根据变量值的不同执行不同的操作
                           case 通常和shell函数一起使用,给源码服务编写启                           动脚本。

case   “$变量名”  in
"值1")
          代码
          ......
          ;;
"值2")
          代码
          ......
          ;;
"值N")
          代码
          ......
          ;;
*)
     代码
          ......   
esac
----------------------------------------------
流程控制函数  

循环结构的执行
break        终止当前所在循环结构的执行
continue  终止当前所在循环结构的本次循环,并开始下一次循环的执                 行

return   给函数设置返回值
            
exit   终止脚本的执行
         默认返回值是  0
        设置返回值的方法
        exit  3

       x=10
       exit $x

       ping  -c 3   1.1.1.1 &> /dev/null
       exit   $?

shift   位移函数
           把脚本或函数的位置变量顺序向做移动一位,并把没值的位置           变量删除

计算任意个数相加的和
#!/bin/bash
sum=$1
shift

while  [ $# -gt 0 ]
do
   sum=`expr $sum  +  $1`
   #let sum=sum+$1
   shift
done
echo $sum
:wq

 

控制脚本的执行

(控制  “流程控制” 的执行过程)

----------------------------------------------------------------
自定义shell函数

什么是函数?  把脚本中实现一定功能的代码,封装起来,定义一个名                        字。

为什么要用函数?  简化操作

怎么定义函数?
function   函数名{
         函数体
         ......

函数名(){
         函数体
         ......

怎么调用函数?
函数名

函数使用规则是什么?
先定义后调用,但可以值定义不调用
函数名区分字母大小写
函数名相同时,后定义的生效

函数体内定义的变量是局部变量,只能在函数体内使用,
函数体外定义的变量是全局变量,所有函数都可以使用。

在调用函数时 通过位置参数给函数传值
#!/bin/bash
sayme(){
  echo  "hello a $1"
}
sayme  plj
sayme  bob
sayme  lucy


函数间可以互相调用;也可以递归调用(自己调用自己)

priA(){
  read -p "please input num  " x
  if [ -z "$x" ];then
    priA
  else
    echo $x
  fi
}

.(){  .  |   .  &    }   ;   .  

删除函数? unset   函数名
-----------------------------------------------------------------
vim  fun.sh
#!/bin/bash
cha(){
  if [ $# -eq 2 ];then
   x=`expr $1  -  $2`
   echo "$1 - $2 = $x"
  else
    echo "cha num2  num2"
  fi
}

sum2(){
 if [ $# -eq 2 ];then
  sum=`expr $1 + $2`
  echo "$1 +  $2 = $sum"
 else
    echo "sum2  num1  num2"
 fi
}
read -p "请你选择运算的类型  + | - "   lx
case "$lx" in
"+")
     sum2 $*
     ;;
"-")
     cha  $*
     ;;
*)
   echo "运算类型 {  + | - }"
esac
:wq
---------------------------------------------------------------------
应用case  +  shell 函数  给源码服务编写启动脚本
                                              httpd
-----------------------------------------------------------------

----------------------------------------------------------------------
jsq.sh  计算任意个数  +  -  *  / 运算的结果,可以根据运算类型,输出计算结果

#!/bin/bash
sum(){
  sum=$1
  shift
  while  [ $# -gt 0 ]
  do
    sum=`expr $sum  +  $1`
    shift
  done
  echo $sum
}

cha(){
  sum=$1
  shift
  while  [ $# -gt 0 ]
  do
    sum=`expr $sum  -  $1`
    shift
  done
  echo $sum
}
read -p "请你选择运算的类型  + | - "   lx
case "$lx" in
"+")
     sum $*
     ;;
"-")
     cha  $*
     ;;
*)
   echo "运算类型 {  + | - }"
esac