shell條件-循環-分支-函數

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章