Linux云计算架构-shell入门到精通(放弃)[2]

Linux云计算架构-shell入门到精通(放弃)[2]

1. 跳出循环

continue:跳出本次循环,进行下次循环

忽略本次循环剩余的代码。默认忽略本次循环剩余的代码,即continue 1;若是continue 2,则表示忽略本次和下次循环的代码。

[root@client ~]# vim break.sh
#!/bin/bash
# 跳出当前循环,即仅无4*4=16,其后的结果继续显示
for i in `seq 9`
do
  sum=$(($i*$i))
  if [ $sum -eq 16 ] ; then
    continue
  else
    echo "$i*$i=$sum"
  fi
done
[root@client ~]# chmod +x break.sh
[root@client ~]# bash break.sh
1*1=1
2*2=4
3*3=9
5*5=25
6*6=36
7*7=49
8*8=64
9*9=81

break:跳出整个循环体

忽略整个循环体的代码,直接进行循环体之后的代码。

#!/bin/bash
# 跳出当整个循环体,即4*4=16以后的结果都不显示,包括4*4=16
for i in `seq 9`
do
  sum=$(($i*$i))
  if [ $sum -eq 16 ] ; then
    break
  else
    echo "$i*$i=$sum"
  fi
done
[root@client ~]# vim continue.sh
[root@client ~]# chmod +x continue.sh
[root@client ~]# bash continue.sh
1*1=1
2*2=4
3*3=9

2. shift参数左移(递归迭代)

shift表示参数左移一位,shift 2表示参数左移两位。类似递归迭代的效果。

[root@client ~]# vim shift.sh
#!/bin/bash
# 累加求和
if [ $# -eq 0 ] ; then
  echo "没有足够的参数"
  exit 0
fi
sum=0
while [ $# -gt 0 ] ; do
  sum=$(($sum+$1))
  shift
done
echo "the result is $sum"
[root@client ~]# chmod +x shift.sh
[root@client ~]# bash shift.sh
没有足够的参数
[root@client ~]# bash shift.sh 1 2 3
the result is 6
[root@client ~]# bash shift.sh 1 2 3 4 5 6 7 8 9 10
the result is 55

3. 函数

函数即脚本代码块。可以使脚本模块化、可读性强。

3.1 定义函数

# 方法1
function name{
    
    
  commands
}

# 方法2
name(){
    
    
  commands
}

# 函数的书写和脚本类似

3.2 调用函数

# 调用函数
name par1 par2 par3 ...

# 函数的参数传递
# 法1:通过脚本的位置参数传递给函数的位置参数【调用参数时使用位置参数】
[root@client ~]# bash rm.sh a.txt
#!/bin/bash
fun1(){
    
    
 rm -rf $1
}
fun1 $1
# 法2:调用函数时直接使用参数
[root@client ~]# bash rm.sh
#!/bin/bash
fun1(){
    
    
 rm -rf $1
}
fun1 /root/a.txt
# 法3:在函数中使用多个位置参数,调用函数时使用多参数传递

3.3 函数中变量处理

局部变量:函数内定义的变量,仅在函数内部有效。
全局变量:在脚本中定义的变量,但在函数内,该变量也可以使用。

[root@client ~]# vim fun.sh
#!/bin/bash
function fun1 {
    
    
 for i in `seq $var`
 do
   sum=$(($i*$i))
   echo "$i*$i=$sum"
 done
}
read -p "input a num:" var
fun1
[root@client ~]# chmod +x fun.sh
[root@client ~]# bash fun.sh
input a num:8
1*1=1
2*2=4
3*3=9
4*4=16
5*5=25
6*6=36
7*7=49
8*8=64

3.4 函数注意点

①函数内含多个同名函数,以最后一个为准。

[root@client ~]# vim fun.sh
#!/bin/bash
fun1(){
    
    
  echo "aaa"
}
fun1(){
    
    
  echo "bbb"
}
fun1(){
    
    
  echo "ccc"
}
fun1
[root@client ~]# chmod +x fun.sh
[root@client ~]# bash fun.sh 
ccc

②函数可以有返回值,用return命令返回值,表示函数中return后的代码都不执行。该返回值是一种状态码。状态码的取值范围为0-255【return 状态码】

[root@client ~]# vim fun.sh
#!/bin/bash
fun1(){
    
    
  echo "aaa"
  return 5
}
fun1
[root@client ~]# bash fun.sh
aaa
[root@client ~]# echo $?
5

echo $?命令可以输出上一个函数的返回值。
④函数常用于计算,故赋值时,函数值应该是一个数字或者字符串。

4. 实战

4.1 自动备份mysql数据库

# 安装mysql数据库,这里用mariadb数据库代替。
# 安装并启动mariadb数据库,从监听来看,服务用的还是mysqld,不愧是父女。
[root@client ~]# ls /media/cdrom/Packages/maria*
/media/cdrom/Packages/mariadb-5.5.60-1.el7_5.x86_64.rpm        /media/cdrom/Packages/mariadb-libs-5.5.60-1.el7_5.x86_64.rpm
/media/cdrom/Packages/mariadb-bench-5.5.60-1.el7_5.x86_64.rpm  /media/cdrom/Packages/mariadb-server-5.5.60-1.el7_5.x86_64.rpm
/media/cdrom/Packages/mariadb-devel-5.5.60-1.el7_5.x86_64.rpm  /media/cdrom/Packages/mariadb-test-5.5.60-1.el7_5.x86_64.rpm
[root@client ~]# yum install mariadb-server -y
[root@client ~]# ll /usr/bin/mysql
-rwxr-xr-x. 1 root root 3539456 8月  16 2018 /usr/bin/mysql
[root@client ~]# rpm -qf /usr/bin/mysql
mariadb-5.5.60-1.el7_5.x86_64
[root@client ~]# systemctl start mariadb
[root@client ~]# netstat -antup | grep mysql
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      19902/mysqld        

# 登录并创建数据库,然后往数据库中插入数据
# 再次登录,可以看到数据库abong是有一个数据表name的。
[root@client ~]# mysqladmin -u root password "123456"
[root@client ~]# mysql -uroot -p123456
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 5.5.60-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| abong              |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

MariaDB [(none)]> use abong;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [abong]> show tables;
+-----------------+
| Tables_in_abong |
+-----------------+
| name            |
+-----------------+
1 row in set (0.00 sec)

MariaDB [abong]> select * from name;
+------+
| id   |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)

MariaDB [abong]> exit
Bye
# 备份步骤:
1、检查当前用户是否是root,检查自动备份mysql的目录是否存在。
2、使用mysqldump备份数据库,生成sql文件,并压缩成tar.gz格式的压缩包。
3、删除sql文件
4、输出备份成功及备份目录信息

[root@client ~]# vim mysqlbak.sh
#!/bin/bash
BAKDIR=/opt/mysqlbak/`date +%Y%m%d`
MYSQLUSER=root
MYSQLPASSWD=123456
MYSQLDB=abong
if [ $UID -ne 0 ] ; then
  echo "it's not root"
  exit 0
fi
if [ ! -d $BAKDIR ] ; then
  mkdir -p $BAKDIR
else
  echo "the $BAKDIR is exist"
  exit 0
fi
mysqldump -u$MYSQLUSER -p$MYSQLPASSWD $MYSQLDB > $BAKDIR/${MYSQLDB}_db.sql
tar czf $BAKDIR/${MYSQLDB}_db.tar.gz $BAKDIR/*.sql &> /dev/null
find $BAKDIR -type f -name *.sql -exec rm -f {
    
    } \;
if [ $? -eq 0 ] ; then
  echo "$MYSQLDB database backup successfully"
  echo "backup dir is $BAKDIR"
fi
[root@client ~]# chmod +x mysqlbak.sh
[root@client ~]# bash mysqlbak.sh
abong database backup successfully
backup dir is /opt/mysqlbak/20200802
[root@client ~]# ll /opt/mysqlbak/20200802
总用量 4
-rw-r--r--. 1 root root 782 8月   2 09:20 abong_db.tar.gz

# 可以看到,非root用户是不可以备份mysql数据库的。
[root@client ~]# cp mysqlbak.sh /home/abong/
[root@client ~]# su - abong
[abong@client ~]$ ll
总用量 4
-rwxr-xr-x. 1 root root 544 8月   2 09:23 mysqlbak.sh
[abong@client ~]$ bash mysqlbak.sh
it's not root

4.2 nginx服务的启动脚本

[root@client ~]# vim /etc/init.d/nginx
#!/bin/bash
# chkconfig: - 99 2
# description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
  $PROG
;;
stop)
  kill -3 $(cat $PIDF)
;;
restart)
  $0 stop &> /dev/null
  if [ $? -ne 0 ] ; then continue ; fi
  $0 start
;;
reload)
  kill -1 $(cat $PIDF)
;;
*)
  echo "Userage: $0 { start | stop | restart | reload }"
  exit 1
esac
exit 0

猜你喜欢

转载自blog.csdn.net/weixin_36522099/article/details/107740756