一、for循环;
二、while循环;
三、case循环;
一、for循环:
概述:for循环根据指定的变量及变量取值列表,针对不同取值,重复执行命令,直到取值列表中的值全部用完,退出,for 循环适用于无规律的取值变量;
语法:for 变量名 in 变量取值列表 ;do
重复执行的命令(循环体),应用到变量名
done
变量取值列表:
命令:cat、seq、awk等命令的屏幕输出结果,例:A=$(cat 1.txt)
列表:直接在取值列表中定义内容
1.{a..z}、{A..Z}、{1..10},直接在取值列表中定义内容;
2.{a,b,c,d},直接在括号中写入内容;
3.a b c d ,不用括号,直接用空格隔开每个值;
数组:
定义数组:数组名=(第0个数组值 第1个数组值)
查看属组:echo ${数组名[数组的第n个位置]} ##显示数组中的第n个值
echo ${数组名[*]} ##显示数组中的所有值
echo ${#数组名[*]} ##显示数组中的值的个数
在脚本中使用数组:举例
#!/bin/bash
A=(vsftpd named sshd)
for i in ${A[*]};do
/etc/init.d/$i start
done
二、while循环:
概述:重复测试某个条件,只要条件成立,就重复执行命令,条件不成立,立即退出,自带判断;
语法:while 条件测试操作 ;do
重复执行的命令
done
while循环体内常用的命令:
let i++等于i=$(expr $i+1) ##变量i每执行一次循环则加1;
expr $RANDOM % 100 ##取得100以内的随机数;
sleep 2 ##休眠2秒,避免死循环真用过多的硬件资源;
退出while循环体的三种方式:
条件为假退出循环体,继续执行循环体以外的命令;
exit退出脚本,循环体外的命令不会执行;
break退出脚本中的循环体,继续执行循环体外的命令;
特殊条件表达式:
true :当条件表达式为true时,那么代表条件表达式永远成立,为真;
false:当条件表达式为false时,那么条件表达式永远为假;
三、case循环:
概述:根据变量的值,顺序匹配模式,匹配后执行命令并结束,如果没有匹配的模式,则执行默认命令,执行成功后退出, 返回1,然后退出case;
语法:case "变量" in
模式1)
命令1
;;
模式2)
命令2
;;
*)
默认命令
exit 1
;;
esac
模式:[0-9]:大括号内-表示一个连续的范围;
A|B:|表示或;
case循环
案例一:交互式定义变量匹配case
[root@ns bin]# cat key_hit_case.sh
#!/bin/bash
read -p "Please hit a key:" KEY
case $KEY in
[a-z]|[A-Z])
echo "your key is alph."
;;
[0-9])
echo "your key is num."
;;
*)
echo "your key may be is #!@ and so on."
exit 1
;;
esac
案例二:位置变量匹配case
[root@ns bin]# cat prog_case.sh
#!/bin/bash
#chkconfig: - 98 10
#description: A script for case by linuxfan.cn.
case $1 in
start)
echo "hehe is starting."
sleep 2
;;
stop)
echo "hehe is stoping."
sleep 2
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage:$0 {start|stop|restart}"
exit 1
;;
esac
案例三:查看vsftpd服务的控制脚本
[root@ns bin]# vim vsftpd
#!/bin/bash
#
### BEGIN INIT INFO
# Provides: vsftpd
# Required-Start: $local_fs $network $named $remote_fs $syslog
# Required-Stop: $local_fs $network $named $remote_fs $syslog
# Short-Description: Very Secure Ftp Daemon
# Description: vsftpd is a Very Secure FTP daemon. It was written completely from
# scratch
### END INIT INFO
# vsftpd This shell script takes care of starting and stopping
# standalone vsftpd.
#
# chkconfig: - 60 50 ##设置允许级别和开、关机的启动顺序
# description: Vsftpd is a ftp daemon, which is the program \
# that answers incoming ftp service requests.
# processname: vsftpd
# config: /etc/vsftpd/vsftpd.conf
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
RETVAL=0
prog="vsftpd"
start() { ##编写start函数,函数将许多的操作集成
# Start daemons.
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 1
[ -x /usr/sbin/vsftpd ] || exit 1
if [ -d /etc/vsftpd ] ; then
CONFS=`ls /etc/vsftpd/*.conf 2>/dev/null`
[ -z "$CONFS" ] && exit 6
PROC_FAILED=0
for i in $CONFS; do
site=`basename $i .conf`
echo -n $"Starting $prog for $site: "
daemon /usr/sbin/vsftpd $i
RETVAL=$?
echo
if [ $RETVAL -eq 0 ] && [ ! -f /var/lock/subsys/$prog ]; then
touch /var/lock/subsys/$prog
elif [ $RETVAL -ne 0 ]; then
ps -FC vsftpd | grep "$i" > /dev/null
RETVAL=$?
if [ $PROC_FAILED -eq 0 ] && [ $RETVAL -ne 0 ]; then
PROC_FAILED=1
fi
fi
done
if [ $RETVAL -eq 0 ] && [ $PROC_FAILED -ne 0 ]; then
RETVAL=1
fi
else
RETVAL=1
fi
return $RETVAL
}
stop() {
# Stop daemons.
echo -n $"Shutting down $prog: "
killproc $prog
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
return $RETVAL
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
RETVAL=$?
;;
condrestart|try-restart|force-reload)
if [ -f /var/lock/subsys/$prog ]; then
stop
start
RETVAL=$?
fi
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|try-restart|force-reload|status}"
exit 1
esac
exit $RETVAL
:wq
for循环
案例一:交互式定义变量匹配case
[root@ns bin]# cat key_hit_case.sh
#!/bin/bash
read -p "Please hit a key:" KEY
case $KEY in
[a-z]|[A-Z])
echo "your key is alph."
;;
[0-9])
echo "your key is num."
;;
*)
echo "your key may be is #!@ and so on."
exit 1
;;
esac
案例二:位置变量匹配case
[root@ns bin]# cat prog_case.sh
#!/bin/bash
#chkconfig: - 98 10
#description: A script for case by linuxfan.cn.
case $1 in
start)
echo "hehe is starting."
sleep 2
;;
stop)
echo "hehe is stoping."
sleep 2
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage:$0 {start|stop|restart}"
exit 1
;;
esac
案例三:查看vsftpd服务的控制脚本
[root@ns bin]# vim vsftpd
#!/bin/bash
#
### BEGIN INIT INFO
# Provides: vsftpd
# Required-Start: $local_fs $network $named $remote_fs $syslog
# Required-Stop: $local_fs $network $named $remote_fs $syslog
# Short-Description: Very Secure Ftp Daemon
# Description: vsftpd is a Very Secure FTP daemon. It was written completely from
# scratch
### END INIT INFO
# vsftpd This shell script takes care of starting and stopping
# standalone vsftpd.
#
# chkconfig: - 60 50 ##设置允许级别和开、关机的启动顺序
# description: Vsftpd is a ftp daemon, which is the program \
# that answers incoming ftp service requests.
# processname: vsftpd
# config: /etc/vsftpd/vsftpd.conf
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
RETVAL=0
prog="vsftpd"
start() { ##编写start函数,函数将许多的操作集成
# Start daemons.
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 1
[ -x /usr/sbin/vsftpd ] || exit 1
if [ -d /etc/vsftpd ] ; then
CONFS=`ls /etc/vsftpd/*.conf 2>/dev/null`
[ -z "$CONFS" ] && exit 6
PROC_FAILED=0
for i in $CONFS; do
site=`basename $i .conf`
echo -n $"Starting $prog for $site: "
daemon /usr/sbin/vsftpd $i
RETVAL=$?
echo
if [ $RETVAL -eq 0 ] && [ ! -f /var/lock/subsys/$prog ]; then
touch /var/lock/subsys/$prog
elif [ $RETVAL -ne 0 ]; then
ps -FC vsftpd | grep "$i" > /dev/null
RETVAL=$?
if [ $PROC_FAILED -eq 0 ] && [ $RETVAL -ne 0 ]; then
PROC_FAILED=1
fi
fi
done
if [ $RETVAL -eq 0 ] && [ $PROC_FAILED -ne 0 ]; then
RETVAL=1
fi
else
RETVAL=1
fi
return $RETVAL
}
stop() {
# Stop daemons.
echo -n $"Shutting down $prog: "
killproc $prog
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
return $RETVAL
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
RETVAL=$?
;;
condrestart|try-restart|force-reload)
if [ -f /var/lock/subsys/$prog ]; then
stop
start
RETVAL=$?
fi
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|try-restart|force-reload|status}"
exit 1
esac
exit $RETVAL
:wq
while、if脚本语句_价格竞猜
vi 价格竞猜.sh ##编辑脚本文件
#!/bin/bash
p=$(expr $RANDOM % 1000) ##设置随机生成在0-999之间的数字的变量p
t=0 ##设置竞猜的初始次数0的变量t
echo "商品价格在0-999之间,祝你好运~~~(退出请输入exit)" ##最初现在在屏幕上的内容
while true ##设置条件一直为真,循环执行循环体
do ##开始写循环体的内容
read -p "输入价格:" n ##设置变量n,使用户手动输入变量内容
let t++ ##使竞猜次数的变量t逐次加1
if [[ $n = "exit" ]];then ##输入的内容是exit,则退出,双层[[]]的作用是避免脚本执行中出现line 9: [: ==: unary operator expected错误
exit 0 && echo "退出成功!!谢谢惠顾!!"
fi
expr $n + 1 &>/dev/null ##使用计算器计算用户竞猜的$n加1的值,将结果输入到黑洞,意义在于当$n为字符时,加1会出现错误值
if [ $? != 0 ];then ##if判断上条命令如果是错误的,返回值“”
echo "请输入纯数字"
elif [ -z $n ];then ##if判断若竞猜价格变量$n字符串为空的话,返回值
echo "输入的数字不能为空"
elif [ $n -eq $p ];then ##if判断$n等于实际价格$p的话,返回值“”,并且exit退出此脚本,显示一共猜测的次数
echo "老铁,恭喜你,答对了。"
if [ $t -ge 10 ];then
echo -e "真尴尬,你猜的次数有点多。。。\n一共猜了$t次"
else
echo "非常棒,您一共输入了$t次。"
fi
exit 0
elif [ $n -gt $p ] && [ $n -le 999 ];then ##if判断$n大于实际价格$p时并且$n小于等于实际价格最大值999时
echo "太高了"
elif [ $n -lt $p ] && [ $n -ge 0 ];then ##if判断$n小于实际价格$p时并且$n大于等于实际价格最小值0时
echo "太低了"
elif [ $n -gt 999 ] || [ $n -lt 0 ];then ##if判断$n不在实际价格0-999之间时
echo "请输入0-999之间的数字"
fi ##结束if的判断语句
done
注意:在此脚本中,应用了while循环语句,if判断语句,和变量的知识,需要注意的时,在循环体中if判断时,注意条件的编写顺序;
while循环
案例一:创建用户
[root@ns bin]# cat useradd_while.sh
#!/bin/bash
PRE=stu
i=0
while [ $i -le 10 ];do
useradd $PRE$i
echo 123123 |passwd --stdin $PRE$i
userdel -r $PRE$i
#i=$(expr $i + 1)
let i++
done
案例二:猜价钱
[root@ns bin]# cat price_guess.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TMS=0
echo "please insert a number like this(1-999)"
while true;do
read -p "please give number:" INT
let TMS++
if [ $INT -eq $PRICE ];then
echo "your luckly. right! "
echo "Your guess $TMS"
exit 0
elif [ $INT -gt $PRICE ];then
echo "Too High,try a again. "
else
echo "Too low,try a again."
fi
done
案例三:测试退出命令
[root@ns bin]# cat die_while.sh
#!/bin/bash
i=0
j=$(expr $RANDOM % 10)
while true;do
echo $i
let i++
sleep 1 ##休眠1秒避免死循环产生
if [ $i -eq $j ];then
echo "ok,$j random"
break ##将break替换为exit执行后查看效果
fi
done
df -hT
联系客服