标签:apr-util mysqld author http profile apach article cut 别名
如今,不会Linux的程序员都不意思说自己是程序员,而不会shell编程就不能说自己会Linux。说起来似乎shell编程很屌啊,然而不用担心,其实shell编程真的很简单。
高大上的解释,往往让人摸不住头脑。一句话概括就是:shell编程就是对一堆Linux命令的逻辑化处理。
Shell是操作系统的最外层, Shell可以合并编程语言以控制进程和文件,以及启动和控制其它程。shell通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出来管理您与操作系统之间的交互。简单来说Shell就是一个用户跟操作系统之间的一个命令解释器。
Shell是用户与 Linux操作系统之间沟通的桥采。用户可以输入命令执行,又可以利用Shell脚本编程去运行。
举个简单的例子,我们做javaweb开发的,在以前,如果要在本地将程序打包,然后部署到远程服务器(抛开现在的ci, 原始的方法), 我们以前的做法通常会经历如下几个步骤:
拉取最新代码(git pull)
编译打包
上传并部署到远程服务器
每次打包都要经历这一个阶段,效率低又烦躁。而此时,我们可以编写一个shell脚本,然后每次只需要运行一下这个shell脚本,即可实现打包部署这一系列动作,彻底解放双手,多好
Linux Shell种类非常多,常见的有: Bourne Shell(usr/bin/sh或/bin/sh)、 Bourne Again Shell(/bin/bash)、
C Shell(/usr/bin/csh),K Shell (/usr/bin/ksh),Shell for Root(/sbin/sh)等。不同的Shell语言的语法有所不同,所以不能交换使用。
最常用的 shell是Bash,也就是 Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用,也是大多数 Linux系统默认的Shell。
接下来我们条写一个简单的shell本。(shell脚本一般文件名以.sh结尾,同时文件第一行定义该脚本为shell脚本)
echo $BASH
vi first_shell.sh //打开一个文件
#!/bin/bash //表明这是一个shell脚本 ? #Filename:first_shell.sh //这是一个注释,没有实际性的意义 #auto echo hello world //注释,脚本功能描述,自动打印"hello world" 的意思,没有实际性的意义 #by authers kds 2020-4 //注释,作者,时间,没有实际性的意义 echo "Hello World!" //打印hello world mkdir -p /local/2020/04/ //mkdir -p :递归创建目录,即使上级目录不存在,会按目录层级自动创建目录
?
esc :退出编辑
wq :保存
没有任何输出则表示脚本没问题
sh -n first_shell.sh
chomd o+x first_shell.sh //添加执行权限 ./first_shell.sh //运行
Shell编程语言是非类型的解释型语言,不像C++/JAVA语言编程时需要事先声明变量, shell给一个变量赋值,实际上就是定义了变量,在 Linux支持的所有shell中,都可以用赋值符号(=)为变景赋值。
shell变量可分为两类:局部变量和环境变量。局部变量只在创建它们的shell脚本中使用。而环境变量则可以在创建它们的 shell及其派生出来的任意子进程中使用。有些变量是用户创建的,其他的则是专用shel1变量。
例如在脚本里面定义A=123,定义这样一个变景,前面变量名,后面是变量的值。
如下:
vi test.sh
#!/bin/bash //表明这是一个shell脚本 #Author kds 2020-4-27 A=369 echo "Printf variables equal is $A"
执行脚本:
/usr/bin/bash first_shell.sh
结果会显示到:
Printf variables equal is 369
简单的理解变量,相当于定义一个别名-名称,引用的时候加上$符号就可以了。
假如定义变景 name= mayun
执行echo $name将会显示 mayun
$0 当前程序的名称
$n 当前程序的第n个参数,n=1,2,…9
$* 当前程序的所有参数(不包括程序本身)
$# 当前程序的参数个数(不包括程序本身)
$? 命令或程序执行完后的状态,一般返回0表示执行成功(直接 echo $? 表示查看上一个命令是否执行成功)。
$UID 当前用户的ID
$PWD 当前所在的目录
vi auto_var.sh
#!/bin/bash #auto print variables #Author kds 2020-4-27 #-e:激活转义字符。 echo -e ‘\033[32m------------------\033[0m‘ echo "This is $0 param !" echo "This \$1 is $1 param !" echo "This \$2 is $2 param !" echo -e ‘\033[32m------------------\033[0m‘ echo "This \$* is $* param !" echo "This \$# is $# param !" echo "This \$? is $? param !" echo
执行脚本:
sh auto_var.sh 11 36
vi auto_httpd.sh
#!/bin/bash #auto install httpd #Author kds 2020-4-27 echo -e ‘\033[32m------------------\033[0m‘ FILES=httpd-2.2.17.tar.bz2 URL=http://mirrors.cnnic.cn/apache/httpd/ PREFIX=/usr/local/apache2/ echo -e ‘\033[36Please Select Install Menu\033[0m‘ echo echo "1) 官方下载Httpd文件包。" echo "2) 解压apache源码包。" echo "3) 编译安装Http服务器。" echo "4) 启动Httpd服务器。" echo -e ‘\033[32m------------------\033[0m‘ sleep 20
?
执行脚本:
sh auto_httpd.sh
在Linux Shell编程中,if,for,while,case等条件流程控制语句用的非常多,把这些学好,对提升脚本的功能有非常大的帮助。
下面将逐个来讲解具体的用法:
if (表达式);then #if (Variable in Array) 语句1 else 语句2 fi #if语句结束 ?
数字大小对比
vi auto_num.sh
#!/bin/sh #author kds 2020-04-28 NUM=100 NUM1=200 if(($NUM > $NUM1));then echo "this num $NUM greater $NUM1 !" else echo "this num $NUM little $NUM1 !" fi
判断目录是否存在,不存在则新建(注意,中括号之间必须要空格)
vi auto_file.sh
#!/bin/sh #author kds 2020-04-28 #judge dir exist DIR=/data/20200411 if [ ! -d $DIR ];then mkdir -p $DIR echo -e "\033[32mThis $DIR Create success! \033[0m" else echo -e "\033[32mThis DIR is exists.Please exit ...! \033[0m" fi
执行脚本:
sh -n auto_file.sh
sh auto_file.sh
判断文件是否存在,存在则打印内容,不存在则创建且往里面写入内容。
vi auto_files.sh
#!/bin/sh #author kds 2020-04-28 #auto test files FILES=/tmp/test.txt ? if [ ! -f $FILES ];then echo "ok" >> $FILES # 两个大于符号时追加,一个是覆盖 else echo -e "\033[32m---------------------!\033[0m" cat $FILES fi
多个条件测试判断
vi auto_scores.sh
#!/bin/sh #author kds 2020-04-28 #auto test scores scores=$1 if [ -z $scores ];then # 为空则退出 echo "Usage:{$0 60|80.}"; exit; elif [[ $scores -gt 85 ]];then echo "very good!"; elif [[ $scores -gt 75 ]];then echo "good!"; elif [[ $scores -gt 60 ]];then echo "pass!"; else echo "no pass!"; fi;
执行脚本:
sh -n auto_scores.sh
sh auto_scores.sh
if条件综合Shell实战脚本编写:
通过if语句和之前变量的学习,今天我们将把我们所学的综合在一起来讲解一个实战运维脚本,一键安装LAMP环境的脚本:
一建源码安装LAMP脚本,先分解脚本的各个小功能:
打印菜单:
1)安装apache WEB服务器
2)安装Mysql DB服务器
3)安装PHP 服务器
4)整合LAMP架构并启动服务
1、Apache服务器安装部署。
下载httpd-2.2.27.tar.gz版本,下载URL,解压,进入安装目录,configure;make ;make install
2、Mysql服务器的安装。
下载mysql-5.5.20.tar.bz2版本,下载URL,解压,进入安装目录,configure;make ;make install
3、PHP服务器安装。
下载php-5.3.8.tar.bz2版本,下载URL,解压,进入安装目录,configure;make ;make install
4、LAMP架构的整合和服务启动。
/usr/local/apache2/bin/apachectl start
vi htdocs/index.php
<?php
phpinfo();
?>
mysql8的配置文件:vi /usr/local/mysql/my.cnf
[mysqld] #skip-grant-tables #collation_server=utf8_general_ci #character_set_server=utf8 collation_server=utf8mb4_zh_0900_as_cs character_set_server=utf8mb4 event_scheduler=ON port=3390 mysqlx_port=33900 max_connections=1000 innodb_buffer_pool_size=3072M table_open_cache=4000 key_buffer_size=384M max_allowed_packet=4M sort_buffer_size=1M read_buffer_size=1M read_rnd_buffer_size=8M myisam_sort_buffer_size=64M thread_cache_size=64 default_authentication_plugin=mysql_native_password datadir=/app/software/mysql8/data socket=/app/software/mysql8/mysql.sock #log-bin=mysql-bin lower_case_table_names=1 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES symbolic-links=0 [mysqld_safe] log-error=/app/software/mysql8/mysql.log pid-file=mysql.pid
vi auto_lamp.sh内容如下:
#!/bin/bash #auto install LAMP #by kds 2020-04-30 #Httpd define path variable H_FILES=httpd-2.4.43.tar.bz2 H_FILES_DIR=httpd-2.4.43 H_URL=http://mirrors.cnnic.cn/apache/httpd/ H_PREFIX=/usr/local/apache2/ ? #MySQL define path variable M_FILES=mysql-8.0.18-el7-x86_64.tar.gz M_URL=https://cdn.mysql.com//Downloads/MySQL-8.0/ M_FILESCNF=/usr/local/mysql/my.cnf ? #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/ ? ? echo -e ‘\033[32m-----------------------------\033[0m‘ echo ? if [ -z "$1" ];then ? echo -e "\033[36mPlease Select Install Menu follow:\033[0m" echo -e "\033[32m1)编译安装Apache服务器\033[1m" echo "2)编译安装MySQL服务器" echo "3)编译安装PHP服务器" echo "4)配置index.php并启动LAMP服务" echo -e "\033[31mUsage: { /bin/sh $0 1|2|3|4|help}\033[0m" exit fi ? if [[ "$1" -eq "help" ]];then echo -e "\033[36mPlease Select Install Menu follow:\033[0m" echo -e "\033[32m1)编译安装Apache服务器\033[1m" echo "2)编译安装MySQL服务器" echo "3)编译安装PHP服务器" echo "4)配置index.php并启动LAMP服务" echo -e "\033[31mUsage: { /bin/sh $0 1|2|3|4|help}\033[0m" exit fi ###################################### #Install httpd web server if [[ "$1" -eq "1" ]];then ? wget -c $H_URL/$H_FILES && tar -jxvf $H_FILES && cd $H_FILES_DIR && ./configure --prefix=$H_PREFIX --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util if [ $? -eq 0 ];then make && make install echo -e "\n\033[32m-----------------------------------------------\033[0m" echo -e "\033[32mThe $H_FILES_DIR Server Install Success !\033[0m" else echo -e "\033[32mThe $H_FILES_DIR Make or Make install ERROR,Please Check......" exit 0 fi fi ? #Install Mysql DB server if [[ "$1" -eq "2" ]];then #配置文件不存在则退出安装 if [ ! -f $M_FILESCNF ];then echo -e "\033[32mThis $M_FILESCNF not is exists.Please exit ...! \033[0m" exit 0 else echo -e "\033[32m---------------------!\033[0m" cat $M_FILESCNF fi wget -c $M_URL/$M_FILES && tar -xzvf $M_FILES && mv $M_FILES_DIR mysql8 && cp $M_FILESCNF mysql8 && cd mysql8 #当前登录用户 ? currentUser=$USER ? #mysql 访问端口 mysqlPort=3390 ? #mysql 插件 端口 mysqlxPort=33900 ? #mysql root 密码 根据实际需要设置 mysqlRootPasswd=‘root‘ ? #mysql新增普通用户名 根据实际需要设置 mysqlPublicUser=mysql8 #mysql新增普通用户密码 根据实际需要设置 mysqlPublicUserPasswd=‘admin‘ mysqlDir=$(cd $(dirname $0); pwd) mkdir data echo $(date +‘%Y-%m-%d %H:%M:%S‘):‘开始初始化数据库启动文件my.cnf‘ ? #sed -i ‘/mysqld/a\datadir=$mysqlDir/data‘ my.cnf; sed -i ‘/^datadir=/c‘\datadir=$mysqlDir\/data‘‘ my.cnf ? #sed -i ‘/mysqld/a\basedir=$mysqlDir‘ my.cnf; sed -i ‘/^basedir=/c‘\basedir=$mysqlDir‘‘ my.cnf ? #sed -i ‘/mysqld/a\port=3390‘ my.cnf; sed -i ‘/^port=/c‘\port=$mysqlPort‘‘ my.cnf ? #sed -i ‘/mysqld/a\port=3390‘ my.cnf; sed -i ‘/^mysqlx_port=/c‘\mysqlx_port=$mysqlxPort‘‘ my.cnf ? #sed -i ‘/mysqld/a\character_set_server=utf8mb4‘ my.cnf; sed -i ‘/^character_set_server=/c‘\character_set_server=utf8mb4‘‘ my.cnf ? #sed -i ‘/mysqld/a\collation_server=utf8mb4_zh_0900_as_cs‘ my.cnf; sed -i ‘/^collation_server=/c‘\collation_server=utf8mb4_zh_0900_as_cs‘‘ my.cnf ? #sed -i ‘/mysqld/a\event_scheduler=ON‘ my.cnf; sed -i ‘/^event_scheduler=/c‘\event_scheduler=ON‘‘ my.cnf ? #sed -i ‘/mysqld/a\socket=$mysqlDir/mysql.sock‘ my.cnf; sed -i ‘/^socket=/c‘\socket=$mysqlDir\/mysql.sock‘‘ my.cnf ? #sed -i ‘/mysqld/a\lower_case_table_names=1‘ my.cnf; sed -i ‘/^lower_case_table_names=/c‘\lower_case_table_names=1‘‘ my.cnf ? #sed -i ‘/mysqld/a\default_authentication_plugin=mysql_native_password‘ my.cnf; sed -i ‘/^default_authentication_plugin=/c‘\default_authentication_plugin=mysql_native_password‘‘ my.cnf ? #sed -i ‘/mysqld/a\skip-grant-tables‘ my.cnf; ? #sed -i ‘/^skip-grant-tables=/c‘\#skip-grant-tables‘‘ my.cnf ? sed -i ‘/^log-error=/c‘\log-error=$mysqlDir\/mysql.log‘‘ my.cnf ? sed -i ‘/^pid-file=/c‘\pid-file=$mysqlDir\/mysql.pid‘‘ my.cnf ? echo $(date +‘%Y-%m-%d %H:%M:%S‘):‘开始初始化数据库启动文件mysql.server‘ ? cp support-files/mysql.server $mysqlDir ? #sed -i ‘46c\basedir=$mysqlDir‘ mysql.server; ? sed -i ‘/^basedir=/c‘\basedir=$mysqlDir‘‘ mysql.server ? #sed -i ‘47c\datadir=$mysqlDir/data‘ mysql.server; ? sed -i ‘/^datadir=/c‘\datadir=$mysqlDir\/data‘‘ mysql.server ? echo $(date +‘%Y-%m-%d %H:%M:%S‘):‘开始初始化数据库‘ ? $mysqlDir/bin/mysqld --defaults-file=$mysqlDir/my.cnf --initialize --user=$USER --basedir=$mysqlDir --datadir=$mysqlDir/data --log-error=$mysqlDir/mysql.log ? echo $(date +‘%Y-%m-%d %H:%M:%S‘):‘数据库初始化完成‘ ? echo $(date +‘%Y-%m-%d %H:%M:%S‘):‘开始启动数据库‘ ? $mysqlDir/mysql.server start ? #修改mysql登录密码 ? tempPasswd=`grep ‘temporary password‘ $mysqlDir/mysql.log` ? mysqlPasswd=`echo ${tempPasswd##*localhost:}` ? echo $(date +‘%Y-%m-%d %H:%M:%S‘):"临时密码:$mysqlPasswd" ? echo $(date +‘%Y-%m-%d %H:%M:%S‘):‘修改root密码‘ ? mysql -uroot -p"${mysqlPasswd}" -S $mysqlDir/mysql.sock -e "ALTER USER ‘root‘@‘localhost‘ IDENTIFIED WITH mysql_native_password BY ‘$mysqlRootPasswd‘" --connect-expired-password ? echo $(date +‘%Y-%m-%d %H:%M:%S‘):‘修改root密码成功‘ ? echo $(date +‘%Y-%m-%d %H:%M:%S‘):‘创建blekey用户‘ ? mysql -uroot -p"$mysqlRootPasswd" -S $mysqlDir/mysql.sock -e "CREATE USER ‘$mysqlPublicUser‘@‘%‘ IDENTIFIED BY ‘$mysqlPublicUserPasswd‘" --connect-expired-password ? echo $(date +‘%Y-%m-%d %H:%M:%S‘):‘创建xxx用户成功‘ ? echo $(date +‘%Y-%m-%d %H:%M:%S‘):‘赋权admin用户‘ ? mysql -uroot -p"$mysqlRootPasswd" -S $mysqlDir/mysql.sock -e "GRANT ALL ON *.* TO ‘$mysqlPublicUser‘@‘%‘" --connect-expired-password ? echo $(date +‘%Y-%m-%d %H:%M:%S‘):‘赋权xxx用户成功‘ ? echo $(date +‘%Y-%m-%d %H:%M:%S‘):‘刷新权限‘ ? mysql -uroot -p"$mysqlRootPasswd" -S $mysqlDir/mysql.sock -e "FLUSH PRIVILEGES" --connect-expired-password ? echo $(date +‘%Y-%m-%d %H:%M:%S‘):‘刷新权限成功‘ #如果当前用户是root配置etc下,如果是普通用户则配置到对应用户下的环境变量 if [ $? -eq 0 ];then sed -i ‘$a \export PATH=‘$mysqlDir‘\/bin:$PATH‘ /etc/profile source /etc/profile echo -e "\033[32mEnvironment configuration complete\033[0m" else echo -e "\033[32mThe $M_FILES_DIR Server Mysql install ERROR,Please Check......\033[0m" exit 0 fi fi #sed -i ‘/^skip-grant-tables=/c‘\#skip-grant-tables‘‘ my.cnf $mysqlDir/mysql.server restart ? #Install PHP server if [[ "$1" -eq "3" ]];then ? wget -c $P_URL/$P_FILES && tar -jxvf $P_FILES && cd $P_FILES_DIR &&./configure --prefix=$P_PREFIX --with-config-file-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 "\n\033[32m-----------------------------------------------\033[0m" echo -e "\033[32mThe $P_FILES_DIR Server Install Success !\033[0m" else echo -e "\033[32mThe $P_FILES_DIR Make or Make install ERROR,Please Check......" exit 0 fi fi #################################### ? if [[ "$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 Fi
-f:判断文件是否存在 eg: if [ -f filename ]
-d:判断目录是否存 eg: if [ -d dir ]
-e:测试文件或目录是否存在(Exist);
-r:测试当前用户是否有权限读取(Read);
-w:测试当前用户是否有权限写入(Write);
-x:测试是否设置有可执行(Excute)权限;
-eq:第一个数等于(Equal)第二个数;
-ne:第一个数不等于(Not Equal)第二个数;
-gt:第一个数大于(Greater Than)第二个数;
-lt:第一个数小于(Lesser Than)第二个数;
-le:第一个数小于或等于(Lesser or Equal)第二个数;
-ge:第一个数大于或等于(Greater or Equal)第二个数;
-a : 双方都成立(and) 逻辑表达式 -a 逻辑表达式
-o : 单方成立(or) 逻辑表达式 -o 逻辑表达式
整数值比较在Shell脚本编写中的应用较多。例如,用来判断已登录用户数量、开启进程数、磁盘使用率是否超标,以及软件版本号是否符号要求等。实际 使用时,往往会通过变量引用、命令替换等方式来获取一个数值。
=:第一个字符串与第二个字符串相同。
!=:第一个字符串与第二个字符串不相同,其中 “ !”表示取反。
-z:检查字符串是否为空,对于未定义或赋予空值的变量将是为空串。
&&:逻辑与,表示“而且”,只有当前后两个条件都成立时,整个测试命令的返回值才为0(结果成立),使用test命令测试时,“&&”可以使用“-a”代替。
||:逻辑或,表示“或者”,只要前后两个条件有一个成立,整个测试命令返回的值即为0(结果成立)。使用test命令测试时可以使用“-o”代替。
!:逻辑否,表示“不”,只有当条件不成立时,整个测试命令返回的值才为0(结果成立)。
vi auto_backup_mysql.sh
#!/bin/sh #author kds 2020-04-28 #auto backup mysql ? #Define PATH 定义变量 BAKDIR=/data/backup/mysql/`date +%Y%m%d` #以日期命名 MYSQLDB=webapp MYSQLPW=backup MYSQLUSR=backup MYSQLCMD=/usr/bin/mysqldump ? #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 echo -e "\033[32mThe $BAKDIR Create is Successfully!\033[0m" else echo This is $BAKDIR exists... fi ? #Use mysqldump backup mysql 使用mysqldump备份数据库 $MYSQLCMD -u$MYSQLUSR -p$MYSQLPW -d $MYSQLDB >$BAKDIR/discuz.sql echo "The mysql backup successfully" if [ $? -eq 0 ];then echo -e "\033[32mThe Mysql Backup $MYSQLDB Successfully!\033[0m" else echo -e "\033[32mThe Mysql Backup $MYSQLDB Failed.Please check!\033[0m" fi ?
定时执行某个脚本
crontab -e
# 此时会进入 vi 的编辑画面让您编辑工作!注意到,每项工作都是一行。
#分 时 日 月 周 |<==============任务的完整命令行
* * * * * /home/blue/do/rsyncfile.sh
内容:
#0 23 * * * /root/scripts/login_day.sh
*/2 * * * * /home/test/first_shell.sh >> /home/test/log_test.log
添加执行权限:chmod +x /home/test/first_shell.sh
重启下cron :service crond restart
查看定时任务是否执行:两分钟执行一次
标签:apr-util mysqld author http profile apach article cut 别名
原文地址:https://www.cnblogs.com/KdeS/p/12837797.html