- 跳出循环break和continue
break概述:跳出当前循环体,执行循环体之后的语句,break后面不加参数,默认为break1,假设break 3 表示跳出第3层循环
continue概述:忽略本次循环剩余的代码,直接进行下次循环,contine 2表示忽略2次条件循环。
#!/bin/bash
while true
do
echo "*********"
echo "1 copy"
echo "2 delete"
echo "3 backup"
echo "4 quit"
echo "**********"
read op
case $op in
1)
continue #不会执行echo "copy"
echo "copy";;
2)
echo "delete";;
3)
echo "backup";;
4)
echo "exit"
break;; #break退出当前循环
*)
echo "please try again"
esac
done
- 使用交互式方法批量添加用户
#!/bin/bash
echo "******************************"
read -p "输入要创建的用户名:" name
read -p "输入要创建的用户数:" num
read -p "输入要创建用户密码:" pass
echo "******************************"
for ((i=1;i<=$num;i=i+1))
do
id $name$i &> /dev/null
if [ ! $? -eq 0 ];then
useradd $name$i &> /dev/null
echo "$pass" | passwd --stdin $name$i &> /dev/null
if [ $? -eq 0 ];then
echo "$name$i 创建成功"
else
echo "$name$i 创建失败"
fi
else
echo "$name$i exist"
fi
done
echo "创建用户完成,结果是..."
tail -$num /etc/passwd
- Shift参数左移指令
shift每执行一次,参数序列顺次左移一个位置,$#的值减1,用于分别处理每个参数,移出去的参数不再可用。
#!/bin/bash
if [ $# -le 0 ];then
echo "没有足够的参数"
exit
fi
sum=0
while [ $# -gt 0 ];do
sum=$[$sum+$1]
shift
#shift 2 一次移动2个参数
echo $#
done
echo result is $sum
- 函数的使用
一个脚本中有重名函数,则以最后一个函数为准。
function name(){
commands
}
name(){
commands
}
例1:return退出当前函数,并返回状态码(0-255)
vim funstion.sh
#!/bin/bash
fun_1(){
echo "this is fun_1"
return 3
echo "我不执行"
}
fun_2(){
echo "this is fun_2"
return 2
}
fun_1
fun_2
sh function.sh
echo $? #结果为2,以脚本最后一个函数的状态码为准。
exit 是直接退出整个脚本,retrun是退出当前函数,并返回数字,并不退出脚本。
例2:函数值赋值给变量
#!/bin/bash
fun1(){
read -p "please input num:" num
echo $[$num*5]
}
num=$(fun1)
echo num is $num
# 输入5 ,结果为25
- 函数的参数传递
例1:通过脚本传递参数给函数中的位置参数$1
#!/bin/bash
fun1(){
rm -rf $1
}
fun1 $1
例2:调用函数时直接传递参数
#!/bin/bash
fun1(){
rm -rf $1
}
fun1 /root/a.txt
例3:函数中多参数传递和使用方法
#!/bin/bash
fun1(){
echo $[$1*5]
echo $[$2*2]
}
fun1 5 2 #直接传两个参数
例4:函数中变量的处理
函数中使用的变量类型有两种:局部变量,全局变量。
全局变量,默认情况下,你在脚本中定义的变量都是全局变量,你在函数外面定义的变量在函数内也可以使用。
#!/bin/bash
fun1(){
num1=$[$var1*2]
}
read -p "input a num:" var1
fun1
echo var1 new value is :
- 实战mysql自动化备份脚本
思路:
- 检查一下运行环境:目录存在,时间,权限,用户
- 运行要执行的命令:备份,导出数据
- 把命令执行过程中没有用的文件删除
- 弹出命令运行成功的消息
#!/bin/bash
#自动备份mysql脚本
#定义变量
BAKDIR=/data/backup/mysql/`date +%Y-%m-%d`
MYSQLDB=xuegod
#MYSQLDB=webapp
MYSQLUSR=root
#MYSQLUSER=backup
MYSQLPW=123456
#MYSQLPW=backup
#必须用root用户运行此脚本,$UID为系统变量
if
[ $UID -ne 0 ];then
echo 这脚本必须用root用户运行!!!
sleep 2
exit 0
fi
#判断目录是否存在,不存在则创建
if [ ! -d $BAKDIR ];then
mkdir -p $BAKDIR
else
echo $BAKDIR 已存在
exit
fi
#使用mysqldump备份数据库
/usr/bin/mysqldump -u$MYSQLUSR -p$MYSQLPW $MYSQLDB > $BAKDIR/${MYSQLDB}_db.sql
cd $BAKDIR;tar -czf ${MYSQLDB}_db.tar.gz *.sql
#如果数据库备份成功,则打印成功,并删除备份目录30天以前的目录
[ $? -eq 0 ] && echo "This `date +%Y-%m-%d`MySQL BACKUP is success"
cd /data/backup/mysql && find . -type d -mtime +30 -exec rm -rf {} \;
echo "The mysql backup successfully"
- 实战nginx服务启动脚本
此nginx脚本使用了函数功能,让脚本具有更强的可读性
vim /etc/init.d/nginx
#!/bin/bash
#chkconfig:2345 80 90
#description:nginx run
#!/bin/bash
# nginx 启动脚本
# @author Andy
# @version 0.0.1
# @date 2020-08-01
PATH=/data/soft/nginx
DESC="nginx daemon"
NAME=nginx
DAEMON=$PATH/sbin/$NAME
CONFILE=$PATH/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
[ -x "$DAEMON" ]||exit 0
do_start(){
$DAEMON -c $CONFIGFILE || echo -n "nginx already running"
}
do_stop(){
$DEAMON -s stop ||echo -n "nginx not running"
}
do_reload(){
$DAEMON -s reload || echo -n "nginx can't reload"
}
case "$1" in
start)
echo -n "String $DESC:$NAME"
do_start
echo "."
;;
stop)
echo -n "Stopping $DESC: $NAME"
do_stop
echo "."
;;
restart)
echo -n "Restarting $DESC:$NAME"
do_stop
do_start
echo "."
;;
*)
echo "Usage:$SCRIPTNAME{start|stop|reload|restart}" >&2
exit 3
;;
esac
exit 0