shell编程学习笔记之一--学习第二天
文章目录
- 一、说明:
- 1、整理一些linux命令必须熟练掌握常的命令(复习+扩展学习Linux命令)
- 2、Linux下vim/vi 编辑器 命令总结
- 3、学习课件:
- 4、之前的博客:
- ①、shell编程学习笔记之一—学习第一天
- 二、实战演练:
- 1、MySQL数据库的自动备份
- 2、crontab 定时任务:
- 2.1. 命令格式
- 2.2. 命令参数
- 2.3. crontab的文件格式
- 2.4. 常用方法:
- 1)、列出crontab文件
- 2)、编辑crontab文件
- 3)、删除crontab文件:
- 2.5. 使用实例:
- 实例1:每1分钟执行一次myCommand
- 实例2:每小时的第3和第15分钟执行
- 实例3:在上午8点到11点的第3和第15分钟执行
- 实例4:每隔两天的上午8点到11点的第3和第15分钟执行
- 实例5:每周一上午8点到11点的第3和第15分钟执行
- 实例6:每晚的21:30重启smb
- 实例7:每月1、10、22日的4 : 45重启smb
- 实例8:每周六、周日的1 : 10重启smb
- 实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb
- 实例10:每星期六的晚上11 : 00 pm重启smb
- 实例11:每一小时重启smb
- 实例12:晚上11点到早上7点之间,每隔一小时重启smb
- 3、每隔2分钟把当前日期写入当前的time.txt文件中
- 1、创建backup_time.sh文件
- 2、测试shell脚本代码逻辑是否正确
- 3、编辑crontab文件:
- 4、LAMP 架构的整合和服务启动
- 5、for循环:
- 示例1—打印出15以内的数:
- 示例2—求100以内的和:
一、说明:
打算从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 backup_mysql.sh
敲入代码(建议自己敲,还可以熟练一下vim操作,非常熟练vim的可以直接复制测试):
这个代码我还没有成功测试,因为公司没有MySQL,所以先跟着视频,敲出来,回家用家里的Ubuntu安装个MySQL测试。
#!/bin/bash
#auto backup mysql db## 标题
#by authors zhaojiafu 2019
#define backup path
BAK_DIR=/data/backup/`date +%Y%m%d`
MYSQLDB=discuz
MYSQLUSER=backup
MYSQLPW=123456
MYSQLCMD=/usr/bin/mysqldump
if [ $UID -ne 0 ];then
echo "Must to be use root for exec shell."
exit
fi
if [ ! -d $BAK_DIR ];then
mkdir -p $BAK_DIR
echo -e "\033[32mThe $BAK_DIR Create Successfully!\033[0m"
else
echo "This $BAK_DIR is exists..."
fi
#Mysql BACKUP COMMAND
$MYSQLCMD -u $MYSQLUSER -p $MYSQLPW -d $MYSQLDB > $BAK_DIR/$MYSQLDB.sql
if [ $? -eq 0 ];then
echo -e "033[32mThe Mysql Backup $MYSQLDB Succcessfully!\033[0m"
else
echo -e "033[32mThe Mysql Backup $MYSQLDB Failed,Please check.\033[0m"
fi
2、crontab 定时任务:
这个我也不太会,正好看到了,学习一下吧,说不定日后用到定时。
参考学习文档:crontab 定时任务
通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常适合周期性的日志分析或数据备份等工作。
2.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文件:
crontab -l
可用来增加备份($HOME/mycron
是你需要备份的一个目录就行):
crontab -l > $HOME/mycron
2)、编辑crontab文件
crontab -e
可以像使用vi编辑其他任何文件那样修改crontab文件并退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时, cron会对其进行必要的完整性检查。如果其中的某个域出现了超出允许范围的值,它会提示你。 我们在编辑crontab文件时,没准会加入新的条目。例如,加入下面的一条:
# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
30 3 1,7,14,21,26 * * /bin/find -name 'core' -exec rm { } \;
然后使用刚刚-l的命令。列出crontab文件:
crontab -l
3)、删除crontab文件:
crontab -r
然后在使用
crontab -l
就会显示没有crontab文件了。
2.5. 使用实例:
实例1:每1分钟执行一次myCommand
* * * * * myCommand
实例2:每小时的第3和第15分钟执行
3,15 * * * * myCommand
实例3:在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * * myCommand
实例4:每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * myCommand
实例5:每周一上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 myCommand
实例6:每晚的21:30重启smb
30 21 * * * /etc/init.d/smb restart
实例7:每月1、10、22日的4 : 45重启smb
45 4 1,10,22 * * /etc/init.d/smb restart
实例8:每周六、周日的1 : 10重启smb
10 1 * * 6,0 /etc/init.d/smb restart
实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb
0,30 18-23 * * * /etc/init.d/smb restart
实例10:每星期六的晚上11 : 00 pm重启smb
0 23 * * 6 /etc/init.d/smb restart
实例11:每一小时重启smb
* */1 * * * /etc/init.d/smb restart
实例12:晚上11点到早上7点之间,每隔一小时重启smb
0 23-7 * * * /etc/init.d/smb restart
3、每隔2分钟把当前日期写入当前的time.txt文件中
根据上面的MySQL命令,我先测试一下定时任务和shell脚本的简单结合,因为公司里面没有MySQL,我也没有权限安装MySQL,先用其他的测试这个功能。
1、创建backup_time.sh文件
vim backup_time.sh
敲入代码:
#!/bin/bash
#auto crontab write time
#by authors zhaojiafu 2019
#time1=`date +%Y-%m-%d %H:%M.%S`
time1=`date +%Y-%m-%d`
file=/home/zjf/shell_study/day02/time.txt
echo "Is reading to write $time1 to $file"
echo $time1 >> $file
然后先用sh命令执行一下,测试脚本是否成功,因为后面要用crontab执行,所以sh文件设计的任何目录要写觉得路径。
2、测试shell脚本代码逻辑是否正确
执行shell脚本:
然后生成一个time.txt 文件
然后cat查看文件:
3、编辑crontab文件:
crontab -e
*/2 * * * * /bin/bash /home/zjf/shell_study/day02/backup_time.sh
其中后面的*
代表所有,*/2
,代码每俩分钟。
记得要写绝对路径。
保存退出之后,然后等待一会就可以执行了。
然后我写会博客,等待了几分钟,在看看time.txt文件:
这个时候说明,定时任务创建成功了。不过好像里面不能写echo打印输出的语句,我写的测试没有出来。
4、LAMP 架构的整合和服务启动
shell脚本代码(还为测试,后续抽时间补充):
#!/bin/bash
#auto intall lamp
#by authors zhaojiafu 2019
#Httpd define path variable
H_FILES=httpd-2.2.27.tar.bz2
H_FILES_DIR=httpd-2.2.27
H_URL=http://mirrors.cnnic.cn/apache/httpd/
H_PREFIX=/usr/local/apache2/
#MySQL define path variable
M_FILES=mysql-5.5.20.tar.gz
M_FILES_DIR=mysql-5.5.20
M_URL=http://down1.chinaunix.net/distfiles/
M_PREFIX=/usr/local/mysql/
#PHP define path variable
P_FILES=php-5.3.28.tar.bz2
P_FILES_DIR=php-5.3.28
P_URL=http://mirrors.sohu.com/php/
P_PREFIX=/usr/local/php5/
#auto Menu Follow
if [ -z "$1" ];then
echo -e "\033[36mPlease Select Install Menu follow:\033[0m"
echo -e "\033[32m1)、编译安装Apache服务器\033[1m"
echo -e "2)、编译安装Mysql服务器"
echo -e "3)、编译安装PHP服务器"
echo -e "4)、配置index.php并启动LAMP服务"
echo -e "\033[31mUsage(用法):{ /bin/bash $0 1|2|3|4|help \033[0m}"
exit
fi
#auto install Apache
if [[ "$1" -eq "1" ]];then
wegt -c $H_URL/$H_FILES &&tar -jxvf $H_FILES &&cd $H_FILES_DIR ;./configure --prefix=$H_PREFIX
if [ $? -eq 0 ];then
make &&make install
echo -e "\033[32mT $H_FILES_DIR Server Install Successfully!\033[0m"
else
echo -e "\033[32mT $H_FILES_DIR Server Install Failed,Please check....\033[0m"
exit
fi
#auto install Mysql
elif [[ "$1" -eq "2" ]];then
wegt -c $M_URL/$M_FILES &&tar -zxvf $M_FILES &&cd $M_FILES_DIR &&yum install cmake -y ;cmake .
-DCMAKE_INSTALL_PREFIX=$M_PREFIX \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DMYSQL_DATADIR=/data/mysql \
-DSYSCONFDIR=/etc \
-DMYSQL_USER=mysql \
-DMYSQL_TCP_PORT=3306 \
-DWITH_XTRADB_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EXTRA_CHARSETS=1 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=all \
-DWITH_BIG_TABLES=1 \
-DWITH_DEBUG=0
make && make install
/bin/cp support-files/my-small.cnf /etc/my.conf
/bin/cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
if [ $? -eq 0 ];then
make &&make install
echo -e "\033[32mT $M_FILES_DIR Server Install Successfully!\033[0m"
else
echo -e "\033[32mT $M_FILES_DIR Server Install Failed,Please check....\033[0m"
exit
fi
#auto install PHP
elif [[ "$1" -eq "3" ]];then
wegt -c $P_URL/$P_FILES &&tar -jxvf $P_FILES &&cd $P_FILES_DIR ;./configure --prefix=$P_PREFIX --with-config-fil
e-path=$P_PREFIX/etc --with-mysql=$M_PREFIX --with-apxs2=$H_PREFIX/bin/apxs
if [ $? -eq 0 ];then
make ZEND_EXTRA_LIBS='-liconv' &&make install
echo -e "\033[32mT $P_FILES_DIR Server Install Successfully!\033[0m"
else
echo -e "\033[32mT $P_FILES_DIR Server Install Failed,Please check....\033[0m"
exit
fi
# 配置 index.php 并启动 LAMP 服务
elif [[ "$1" -eq "4" ]];then
sed -i '/DirectoryIndex/s/index.html/index.php index.html/g' $H_PREFIX/conf/httpd.conf
$H_PREFIX/bin/apachectl restart
echo "AddType application/x-httpd-php .php" >>$H_PREFIX/conf/httpd.conf
IP=`ifconfig eth1|grep "Bcast"|awk '{print $2}'|cut -d: -f2`
echo "You can access http://$IP/"
# cat >$H_PREFIX/htdocs/index.php <<EOF <?php phpinfo(); ?> EOF
cat >$H_PREFIX/htdocs/index.php <<EOF <?php phpinfo(); ?> EOF
Fi
else
echo "输入参数格式错误,请重新输入:"
echo -e "\033[36mPlease Select Install Menu follow:\033[0m"
echo -e "\033[32m1)、编译安装Apache服务器\033[1m"
echo -e "2)、编译安装Mysql服务器"
echo -e "3)、编译安装PHP服务器"
echo -e "4)、配置index.php并启动LAMP服务"
echo -e "\033[31mUsage(用法):{ /bin/bash $0 1|2|3|4|help \033[0m}"
exit
fi
记得:下面这段cat要顶格,不然好像报错,具体安装代码还没有测试,测试了再来补充。
cat >$H_PREFIX/htdocs/index.php <<EOF <?php phpinfo(); ?> EOF
Fi
5、for循环:
示例1–打印出15以内的数:
vim for1.sh
敲入代码:
#!/bin/bash
#auto for 1 15
#by authors zhaojiafu 2019
for i in `seq 1 20`
do
echo "Num is $i"
done
执行代码:
sh for1.sh
结果:
示例2–求100以内的和:
vim for2.sh
敲入代码:
#!/bin/bash
#auto 100以内的和
#by authors zhaojiafu 2019
sum=0
for ((i=0;i<=100;i++))
do
sum=`expr $i + $sum`
done
echo $sum
执行代码和结果:
还没有评论,来说两句吧...