Shell编程——跳出循环、shift参数左移、函数的使用
目录
1.跳出循环
- break:跳出整个循环
- break概述:跳出当前整个循环或结束当前循环,在for、while等循环语句中,用于跳出当前所在的循环体,执行循环体之后的语句,后面如果什么也不加,表示跳出当前循环等价于break 1,也可以在后面加数字,假设break 3表示跳出第三层循环
- continue:跳过本次循环,进行下次循环
- continue概述:忽略本次循环剩余的代码,直接进行下一次循环;在for、while等循环语句中,用于跳出当前所在的循环体,执行循环体之后的语句,如果后面加的数字是1,表示忽略本次条件循环,如果是2的话,忽略下来2次条件的循环
示例1:写一个shell菜单,当按数字键4时退出,否则一直循环显示
break_continue.sh脚本:
运行结果:
示例2:
#!/bin/bash
while :
do
read -p "Please enter prefix & password & num:" pre pass num
printf "user information:
*********************
user prefix: $pre
user password: $pass
user number: $num
********************
"
read -p "Are you sure?[y/n] " action
if [ "$action" == "y" ];then
break
fi
done
for i in $(seq $num) # 从i =1开始,取到 $num 。 seq 表示 1-$num
#$(seq $num) 等于 ` seq $num ` ; $( 命令 ) ; ${ 变量 } ; [ 表达式/条件 ]
do
user=${pre}${i}
id $user &> /dev/null
if [ $? -ne 0 ];then
useradd $user
echo "$pass"|passwd --stdin $user &> /dev/null
if [ $? -eq 0 ];then
echo -e "\033[31m$user\033[0m creat" #以红色来显示用户名
fi
else
echo "user $user exist"
fi
done
运行结果:
2.Shift参数左移指令
shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本)
在扫描处理脚本程序的参数时,经常要用到的shift命令,如果你的脚本需要10个或10个以上的参数,你就需要用shift命令来访问第10个及其后面的参数
作用:每执行一次,参数序列顺次左移一个位置,$#的值减1,用于分别处理每个参数,移出去的参数,不再可用
示例:加法计算器
3.函数的使用
(1)函数创建语法
方法1:
function name空格{
commands
}
注意:name是函数唯一的名称
方法2:name后面的括号表示你正在定义一个函数
name(){
commands
}
调用函数语法:
函数名 参数1 参数2 …
调用函数时,可以传递参数。在函数中用$1、$2…来引用传递的参数
(2)函数的使用
注意:函数名的使用,如果在一个脚本中定义了重复的函数名,那么以最后一个为准
(3)返回值
使用return命令来退出函数并返回特定的退出码
注:状态码的确定必需要在函数一结束就运行return返回值;状态码的取值范围(0~255)
exit 数字 和return 数字的区别?
- exit整个脚本就直接退出,返回数字 ;
- return 只是在函数最后添加一行,然后返回数字,只能让函数后面的命令不执行,无法强制退出整个脚本的。
(4) 把函数值赋给变量使用
函数名就相当于一个命令
(5)函数的参数传递
第一种:通过脚本传递参数给函数中的位置参数$1
第二种:调用函数时直接传递参数
函数中多参数传递和使用方法
、、
(6)函数中变量的处理
函数使用的变量类型有两种:
- 局部变量
- 全局变量
1、全局变量,默认情况下,在函数体外定义的变量都是全局变量,在函数外面定义的变量在函数内也可以使用
2.局部变量:在函数内的定义的变量
(7)用特殊字符来处理参数
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
aaa@qq.com | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
4.实战
(1)自动备份mysql数据库脚本
从centos7.0开始,系统中自带的mysql数据库包,改为mariadb数据库。
MariaDB数据库概述:MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。MariaDB由MySQL的创始人Michael Widenius(迈克尔·维德纽斯)主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL DB卖给了SUN,此后,随着SUN被甲骨文收购,MySQL的所有权也落入Oracle的手中。MariaDB名称来自Michael Widenius的女儿Maria(玛丽亚)的名字。
甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。 过去一年中,大型互联网用户以及Linux发行商纷纷抛弃MySQL,转投MariaDB阵营。MariaDB是目前最受关注的MySQL数据库衍生版,也被视为开源数据库MySQL的替代品。
安装mariadb数据库:
注: mariadb 是mysql的客户端命令 ;mariadb mariadb-server 是mysql服务端命令
启动marIadb:
给root用户配置一个密码:
登录mysql:
创建并加载数据库:
创建表并插入数据:
mysql自动化备份脚本:
思路:
- 1、检查一下运行环境: 目录是否存在,时间,权限,用户
- 2、运行要执行的命令:备份,导出数据。。。
- 3、把命令执行过程中的没有用的文件删除一下
- 4、弹出命令运行成功的消息
#!/bin/sh
#auto backup mysql
#Define PATH定义变量
BAKDIR=/data/backup/mysql/`date +%Y-%m-%d`
MYSQLDB=xuegod
#MYSQLDB=webapp
MYSQLUSR=root
#MYSQLUSR=backup
MYSQLPW=123456
#MYSQLPW=backup #mysql数据库密码
#must use root user run scripts 必须使用root用户运行,$UID为系统变量
if
[ $UID -ne 0 ];then
echo This script must use the root user ! ! !
sleep 2
exit 0
fi
#Define DIR and mkdir DIR 判断目录是否存在,不存在则新建
if
[ ! -d $BAKDIR ];then
mkdir -p $BAKDIR
else
echo This is $BAKDIR exists....
exit
fi
#Use mysqldump backup mysql 使用mysqldump备份数据库
/usr/bin/mysqldump -u$MYSQLUSR -p$MYSQLPW $MYSQLDB > $BAKDIR/${MYSQLDB}_db.sql
cd $BAKDIR ; tar -czf ${MYSQLDB}_db.tar.gz *.sql
#查找备份目录下以.sql结尾的文件并删除
find $BAKDIR -type f -name *.sql -exec rm -rf {} \;
#或
#如果数据库备份成功,则打印成功,并删除备份目录30天以前的目录
[ $? -eq 0 ] && echo “This `date +%Y-%m-%d` MySQL BACKUP is SUCCESS”
cd /data/backup/mysql/ && find . -type d -mtime +30 |xargs rm -rf
echo "The mysql backup successfully "
(2)nginx服务启动脚本
#!/bin/bash
#chkconfig: 2345 80 90
#description:nginx run
# nginx启动脚本
PATH=/data/soft/nginx
DESC="nginx daemon"
NAME=nginx
DAEMON=$PATH/sbin/$NAME #/data/soft/nginx/sbin/nginx
CONFIGFILE=$PATH/$NAME.conf
PIDFILE=$PATH/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
[ -x "$DAEMON" ] || exit 0
do_start()
{
$DAEMON -c $CONFIGFILE || echo -n "nginx already running"
}
do_stop()
{
$DAEMON -s stop || echo -n "nginx not running"
}
do_reload()
{
$DAEMON -s reload || echo -n "nginx can't reload"
}
case "$1" in
start)
echo -n "Starting $DESC: $NAME"
do_start
echo "."
;;
stop)
echo -n "Stopping $DESC: $NAME"
do_stop
echo "."
;;
reload|graceful)
echo -n "Reloading $DESC configuration..."
do_reload
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