您的位置:首页 > 运维架构 > Shell

shell条件-循环-分支-函数

2016-04-15 16:20 627 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: