一、说明:

打算从B站学习一下shell编程,从很多的课程视频中,挑选了一个:
B站视频地址
打算开始学习着做着笔记:
这个需要一些Linux基础,还有vim的,如果不太熟练,可以看下我之前的整理的俩个博客:

1、整理一些linux命令必须熟练掌握常的命令(复习+扩展学习Linux命令)

整理一些linux命令必须熟练掌握常的命令(复习+扩展学习Linux命令)

2、Linux下vim/vi 编辑器 命令总结

Linux下vim/vi 编辑器 命令总结

3、学习课件:

这个地址我直接把B站中评论下方分享的弄出来了,如果失效,可以下方评论,我把我下载的分享给你。
下载地址

4、之前的博客:

①、shell编程学习笔记之一–学习第一天

shell编程学习笔记之一–学习第一天

二、实战演练:

1、MySQL数据库的自动备份

1
vim backup_mysql.sh

敲入代码(建议自己敲,还可以熟练一下vim操作,非常熟练vim的可以直接复制测试):

这个代码我还没有成功测试,因为公司没有MySQL,所以先跟着视频,敲出来,回家用家里的Ubuntu安装个MySQL测试。

1
#!/bin/bash
2
#auto backup mysql db## 标题
3
#by authors zhaojiafu 2019
4
#define backup path
5
6
BAK_DIR=/data/backup/`date +%Y%m%d`
7
MYSQLDB=discuz
8
MYSQLUSER=backup
9
MYSQLPW=123456
10
MYSQLCMD=/usr/bin/mysqldump
11
12
if [ $UID -ne 0 ];then
13
        echo "Must to be use root for exec shell."
14
        exit
15
fi
16
17
if [ ! -d $BAK_DIR ];then
18
        mkdir -p $BAK_DIR
19
        echo -e "\033[32mThe $BAK_DIR Create Successfully!\033[0m"
20
else
21
        echo "This $BAK_DIR is exists..."
22
23
fi
24
25
#Mysql BACKUP COMMAND
26
$MYSQLCMD -u $MYSQLUSER -p $MYSQLPW -d $MYSQLDB > $BAK_DIR/$MYSQLDB.sql
27
28
if [ $? -eq 0 ];then
29
        echo -e "033[32mThe Mysql Backup $MYSQLDB Succcessfully!\033[0m"
30
else
31
        echo -e "033[32mThe Mysql Backup $MYSQLDB Failed,Please check.\033[0m"
32
fi

2、crontab 定时任务:

这个我也不太会,正好看到了,学习一下吧,说不定日后用到定时。
参考学习文档:crontab 定时任务

通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常适合周期性的日志分析或数据备份等工作。

2.1. 命令格式

1
crontab [-u user] file crontab [-u user] [ -e | -l | -r ]

2.2. 命令参数

-u user:用来设定某个用户的crontab服务; file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
-i:在删除用户的crontab文件时给确认提示。

2.3. crontab的文件格式

1
分 时 日 月 星期 要运行的命令

注意:前面5个域用空格分隔

第1列分钟0~59
第2列小时0~23(0表示子夜)
第3列日1~31
第4列月1~12
第5列星期0~7(0和7表示星期天)
第6列要运行的命令

2.4. 常用方法:

1)、列出crontab文件

列出crontab文件:

1
crontab -l

可用来增加备份($HOME/mycron是你需要备份的一个目录就行):

1
crontab -l > $HOME/mycron

2)、编辑crontab文件

1
crontab -e

可以像使用vi编辑其他任何文件那样修改crontab文件并退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时, cron会对其进行必要的完整性检查。如果其中的某个域出现了超出允许范围的值,它会提示你。 我们在编辑crontab文件时,没准会加入新的条目。例如,加入下面的一条:

1
# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
2
30 3 1,7,14,21,26 * * /bin/find -name 'core' -exec rm {} \;

然后使用刚刚-l的命令。列出crontab文件:

1
crontab -l
在这里插入图片描述
在这里插入图片描述

3)、删除crontab文件:

1
crontab -r

然后在使用

1
crontab -l

就会显示没有crontab文件了。

2.5. 使用实例:

实例1:每1分钟执行一次myCommand

1
* * * * * myCommand

实例2:每小时的第3和第15分钟执行

1
3,15 * * * * myCommand

实例3:在上午8点到11点的第3和第15分钟执行

1
3,15 8-11 * * * myCommand

实例4:每隔两天的上午8点到11点的第3和第15分钟执行

1
3,15 8-11 */2  *  * myCommand

实例5:每周一上午8点到11点的第3和第15分钟执行

1
3,15 8-11 * * 1 myCommand

实例6:每晚的21:30重启smb

1
30 21 * * * /etc/init.d/smb restart

实例7:每月1、10、22日的4 : 45重启smb

1
45 4 1,10,22 * * /etc/init.d/smb restart

实例8:每周六、周日的1 : 10重启smb

1
10 1 * * 6,0 /etc/init.d/smb restart

实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb

1
0,30 18-23 * * * /etc/init.d/smb restart

实例10:每星期六的晚上11 : 00 pm重启smb

1
0 23 * * 6 /etc/init.d/smb restart

实例11:每一小时重启smb

1
* */1 * * * /etc/init.d/smb restart

实例12:晚上11点到早上7点之间,每隔一小时重启smb

1
0 23-7 * * * /etc/init.d/smb restart

3、每隔2分钟把当前日期写入当前的time.txt文件中

根据上面的MySQL命令,我先测试一下定时任务和shell脚本的简单结合,因为公司里面没有MySQL,我也没有权限安装MySQL,先用其他的测试这个功能。

1、创建backup_time.sh文件

1
vim backup_time.sh

敲入代码:

1
#!/bin/bash
2
#auto crontab write time
3
#by authors zhaojiafu 2019
4
5
6
#time1=`date +%Y-%m-%d %H:%M.%S`
7
time1=`date +%Y-%m-%d`
8
file=/home/zjf/shell_study/day02/time.txt
9
10
echo "Is reading to write $time1 to $file"
11
echo $time1 >> $file

然后先用sh命令执行一下,测试脚本是否成功,因为后面要用crontab执行,所以sh文件设计的任何目录要写觉得路径。

2、测试shell脚本代码逻辑是否正确

执行shell脚本:

在这里插入图片描述
在这里插入图片描述

然后生成一个time.txt 文件

在这里插入图片描述
在这里插入图片描述

然后cat查看文件:

在这里插入图片描述
在这里插入图片描述

3、编辑crontab文件:

1
crontab -e
1
*/2 * * * * /bin/bash /home/zjf/shell_study/day02/backup_time.sh

其中后面的*代表所有,*/2,代码每俩分钟。
记得要写绝对路径。

保存退出之后,然后等待一会就可以执行了。

然后我写会博客,等待了几分钟,在看看time.txt文件:

在这里插入图片描述
在这里插入图片描述

这个时候说明,定时任务创建成功了。不过好像里面不能写echo打印输出的语句,我写的测试没有出来。

4、LAMP 架构的整合和服务启动

shell脚本代码(还为测试,后续抽时间补充):

1
#!/bin/bash
2
#auto intall lamp
3
#by authors zhaojiafu 2019
4
5
6
#Httpd define path variable
7
H_FILES=httpd-2.2.27.tar.bz2
8
H_FILES_DIR=httpd-2.2.27
9
H_URL=http://mirrors.cnnic.cn/apache/httpd/
10
H_PREFIX=/usr/local/apache2/
11
12
13
#MySQL define path variable
14
M_FILES=mysql-5.5.20.tar.gz
15
M_FILES_DIR=mysql-5.5.20
16
M_URL=http://down1.chinaunix.net/distfiles/
17
M_PREFIX=/usr/local/mysql/
18
19
#PHP define path variable
20
P_FILES=php-5.3.28.tar.bz2
21
P_FILES_DIR=php-5.3.28
22
P_URL=http://mirrors.sohu.com/php/
23
P_PREFIX=/usr/local/php5/
24
25
26
#auto Menu Follow
27
if [ -z "$1" ];then
28
        echo -e "\033[36mPlease Select Install Menu follow:\033[0m"
29
        echo -e "\033[32m1)、编译安装Apache服务器\033[1m"
30
        echo -e "2)、编译安装Mysql服务器"
31
        echo -e "3)、编译安装PHP服务器"
32
        echo -e "4)、配置index.php并启动LAMP服务"
33
        echo -e "\033[31mUsage(用法):{ /bin/bash $0 1|2|3|4|help \033[0m}"
34
        exit
35
fi
36
#auto install Apache
37
if [[ "$1" -eq "1" ]];then
38
39
40
        wegt -c $H_URL/$H_FILES &&tar -jxvf $H_FILES &&cd $H_FILES_DIR ;./configure --prefix=$H_PREFIX
41
42
        if [ $? -eq 0 ];then
43
                make &&make install
44
                echo -e "\033[32mT $H_FILES_DIR Server Install Successfully!\033[0m"
45
        else
46
                echo -e "\033[32mT $H_FILES_DIR Server Install Failed,Please check....\033[0m"
47
                exit
48
        fi
49
#auto install Mysql
50
elif [[ "$1" -eq "2" ]];then
51
52
        wegt -c $M_URL/$M_FILES &&tar -zxvf $M_FILES &&cd $M_FILES_DIR &&yum install cmake -y ;cmake .
53
-DCMAKE_INSTALL_PREFIX=$M_PREFIX \
54
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
55
-DMYSQL_DATADIR=/data/mysql \
56
-DSYSCONFDIR=/etc \
57
-DMYSQL_USER=mysql \
58
-DMYSQL_TCP_PORT=3306 \
59
-DWITH_XTRADB_STORAGE_ENGINE=1 \
60
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
61
-DWITH_PARTITION_STORAGE_ENGINE=1 \
62
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
63
-DWITH_MYISAM_STORAGE_ENGINE=1 \
64
-DWITH_READLINE=1 \
65
-DENABLED_LOCAL_INFILE=1 \
66
-DWITH_EXTRA_CHARSETS=1 \
67
-DDEFAULT_CHARSET=utf8 \
68
-DDEFAULT_COLLATION=utf8_general_ci \
69
-DEXTRA_CHARSETS=all \
70
-DWITH_BIG_TABLES=1 \
71
-DWITH_DEBUG=0
72
make && make install
73
/bin/cp support-files/my-small.cnf /etc/my.conf
74
/bin/cp support-files/mysql.server /etc/init.d/mysqld
75
chmod +x /etc/init.d/mysqld
76
chkconfig --add mysqld
77
chkconfig mysqld on
78
79
        if [ $? -eq 0 ];then
80
                make &&make install
81
                echo -e "\033[32mT $M_FILES_DIR Server Install Successfully!\033[0m"
82
        else
83
                echo -e "\033[32mT $M_FILES_DIR Server Install Failed,Please check....\033[0m"
84
                exit
85
        fi
86
#auto install PHP
87
elif [[ "$1" -eq "3" ]];then
88
89
        wegt -c $P_URL/$P_FILES &&tar -jxvf $P_FILES &&cd $P_FILES_DIR ;./configure --prefix=$P_PREFIX --with-config-fil
90
e-path=$P_PREFIX/etc --with-mysql=$M_PREFIX --with-apxs2=$H_PREFIX/bin/apxs
91
92
        if [ $? -eq 0 ];then
93
                make ZEND_EXTRA_LIBS='-liconv' &&make install
94
                echo -e "\033[32mT $P_FILES_DIR Server Install Successfully!\033[0m"
95
        else
96
                echo -e "\033[32mT $P_FILES_DIR Server Install Failed,Please check....\033[0m"
97
                exit
98
        fi
99
# 配置 index.php 并启动 LAMP 服务
100
elif [[ "$1" -eq "4" ]];then
101
        sed -i '/DirectoryIndex/s/index.html/index.php index.html/g' $H_PREFIX/conf/httpd.conf
102
        $H_PREFIX/bin/apachectl restart
103
        echo "AddType application/x-httpd-php .php" >>$H_PREFIX/conf/httpd.conf
104
        IP=`ifconfig eth1|grep "Bcast"|awk '{print $2}'|cut -d: -f2`
105
        echo "You can access http://$IP/"
106
#       cat >$H_PREFIX/htdocs/index.php <<EOF <?php phpinfo(); ?> EOF
107
cat >$H_PREFIX/htdocs/index.php <<EOF
108
<?php phpinfo();
109
?>
110
EOF
111
Fi
112
113
else
114
        echo "输入参数格式错误,请重新输入:"
115
        echo -e "\033[36mPlease Select Install Menu follow:\033[0m"
116
        echo -e "\033[32m1)、编译安装Apache服务器\033[1m"
117
        echo -e "2)、编译安装Mysql服务器"
118
        echo -e "3)、编译安装PHP服务器"
119
        echo -e "4)、配置index.php并启动LAMP服务"
120
        echo -e "\033[31mUsage(用法):{ /bin/bash $0 1|2|3|4|help \033[0m}"
121
        exit
122
fi

记得:下面这段cat要顶格,不然好像报错,具体安装代码还没有测试,测试了再来补充。

1
cat >$H_PREFIX/htdocs/index.php <<EOF
2
<?php phpinfo();
3
?>
4
EOF
5
Fi

5、for循环:

示例1–打印出15以内的数:

1
vim for1.sh

敲入代码:

1
#!/bin/bash
2
#auto for 1 15
3
#by authors zhaojiafu 2019
4
5
for i in `seq 1 20`
6
7
do
8
        echo "Num is $i"
9
done

执行代码:

1
sh for1.sh

结果:

在这里插入图片描述
在这里插入图片描述

示例2–求100以内的和:

1
vim for2.sh

敲入代码:

1
#!/bin/bash
2
#auto 100以内的和
3
#by authors zhaojiafu 2019
4
5
sum=0
6
7
for ((i=0;i<=100;i++))
8
9
do
10
        sum=`expr $i + $sum`
11
12
done
13
14
echo $sum

执行代码和结果:

在这里插入图片描述
在这里插入图片描述