一、说明:
打算从B站学习一下shell编程,从很多的课程视频中,挑选了一个:
B站视频地址:
打算开始学习着做着笔记:
这个需要一些Linux基础,还有vim的,如果不太熟练,可以看下我之前的整理的俩个博客:
1、整理一些linux命令必须熟练掌握常的命令(复习+扩展学习Linux命令)
整理一些linux命令必须熟练掌握常的命令(复习+扩展学习Linux命令)
2、Linux下vim/vi 编辑器 命令总结
Linux下vim/vi 编辑器 命令总结
3、学习课件:
这个地址我直接把B站中评论下方分享的弄出来了,如果失效,可以下方评论,我把我下载的分享给你。
下载地址
4、之前的博客:
①、shell编程学习笔记之一–学习第一天
shell编程学习笔记之一–学习第一天
二、实战演练:
1、MySQL数据库的自动备份
敲入代码(建议自己敲,还可以熟练一下vim操作,非常熟练vim的可以直接复制测试):
这个代码我还没有成功测试,因为公司没有MySQL,所以先跟着视频,敲出来,回家用家里的Ubuntu安装个MySQL测试。
1 | #!/bin/bash |
2 |
|
3 |
|
4 |
|
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 |
|
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的文件格式
注意:前面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文件:
可用来增加备份($HOME/mycron
是你需要备份的一个目录就行):
1 | crontab -l > $HOME/mycron |
2)、编辑crontab文件
可以像使用vi编辑其他任何文件那样修改crontab文件并退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时, cron会对其进行必要的完整性检查。如果其中的某个域出现了超出允许范围的值,它会提示你。 我们在编辑crontab文件时,没准会加入新的条目。例如,加入下面的一条:
1 |
|
2 | 30 3 1,7,14,21,26 * * /bin/find -name 'core' -exec rm {} \; |
然后使用刚刚-l的命令。列出crontab文件:
3)、删除crontab文件:
然后在使用
就会显示没有crontab文件了。
2.5. 使用实例:
实例1:每1分钟执行一次myCommand
实例2:每小时的第3和第15分钟执行
实例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 | #!/bin/bash |
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
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 | */2 * * * * /bin/bash /home/zjf/shell_study/day02/backup_time.sh |
其中后面的*
代表所有,*/2
,代码每俩分钟。
记得要写绝对路径。
保存退出之后,然后等待一会就可以执行了。
然后我写会博客,等待了几分钟,在看看time.txt文件:
这个时候说明,定时任务创建成功了。不过好像里面不能写echo打印输出的语句,我写的测试没有出来。
4、LAMP 架构的整合和服务启动
shell脚本代码(还为测试,后续抽时间补充):
1 | #!/bin/bash |
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 | #!/bin/bash |
2 |
|
3 |
|
4 |
|
5 | for i in `seq 1 20` |
6 |
|
7 | do |
8 | echo "Num is $i" |
9 | done |
执行代码:
结果:
示例2–求100以内的和:
敲入代码:
1 | #!/bin/bash |
2 |
|
3 |
|
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 |
执行代码和结果: