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