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

shell流程控制  ( if  結構     循環結構    分支結構)
                       控制腳本的執行過程
                       流程控制彼此能夠互相嵌套使用,也能夠本身嵌套本身
                       根據條件的條件判斷結果執行
-----------------------------------------------------
if結構shell

單分支vim

if  條件判斷;then
    執行的代碼
    ......
fibash

if  條件判斷
then
    執行的代碼
    ......
fi
----------------------------------------
雙分支服務器

if  條件判斷;then
       代碼
       ......
else
       代碼
       ......
fi
--------------------------------------------------------------------
#!/bin/bash
read -p "請輸入你要查找的用戶名 "  username
echo $usernameide

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
:wqip

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

----------------------------------------------------------------------
根據輸入的分數,判斷成績優劣
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 "請你選擇運算的類型  + | - "   lxcase "$lx" in"+")     sum $*     ;;"-")     cha  $*     ;;*)   echo "運算類型 {  + | - }"esac

相關文章
相關標籤/搜索