shell编程基础知识

一、shell常见系统变量

SHELL常见的系统变量解析 :
$0 当前程序的名称
$n 当前程序的第 n 个参数 ,n=1,2, , 9
$* 当前程序的所有参数 ( 不包括程序本身 )
$# 当前程序的参数个数 ( 不包括程序本身 )
$? 命令或程序执行完后的状态,一般返回 0 表示执行成功。
$UID 当前用户的 ID
$PWD 当前所在的目录

#!/bin/bash
#auto print variables
#by wugk 2014-09
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 !"

二、if条件语句

2.1逻辑运算符解析

-f 判断文件是否存在 eg: if [ -f filename ]
-d 判断目录是否存在 eg: if [ -d dir ]
-eq 等于 应用于:整型比较
-ne 不等于 应用于:整型比较
-lt 小于 应用于:整型比较
-gt 大于 应用于:整型比较
-le 小于或等于 应用于:整型比较
-ge 大于或等于 应用于:整型比较
-a 双方都成立( and) 逻辑表达式 –a 逻辑表达式
-o 单方成立( or) 逻辑表达式 –o 逻辑表达式
-z 空字符串

2.2测试数字大小

注意,有两个(())括号

#!/bin/sh
NUM=100
if (( $NUM > 4 )) ;then
echo “this num is $NUM greater 4 ! ”
fi

2.3if多条件测试判断

#!/bin/sh
scores=80
if [[ $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

2.4判断目录、文件是否存在

#!/bin/bash

#判断目录是否存在
if [ ! -d /tmp/2020 ];then
        mkdir -p /tmp/2020
        echo -e "\033[32mthis not exist. \033[0m"
else
        echo -e "\033[32mthis exist. \033[0m"
fi

#判断文件是否存在
files=/tmp/test.txt

if [ ! -f $files ];then
        echo "ok" >> $files
else
        cat $files
fi
 

2.5备份mysql数据库

#!/bin/sh
#auto backup mysql
#wugk 2012-12-12
#Define PATH 定义变量
BAKDIR=/data/backup/mysql/`date +%Y-%m-%d`
MYSQLDB=webapp
MYSQLPW=backup
MYSQLUSR=backup
#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
else
	echo This is $BAKDIR exists....
fi
	#Use mysqldump backup mysql 使用 mysqldump备份数据库
	/usr/bin/mysqldump -u$MYSQLUSR -p$MYSQLPW -d$MYSQLDB >$BAKDIR/webapp_db.sql
	echo "The mysql backup successfully "

2.6配置定时任务

crontab -e

分、时、日、月、星期
配置每天0时0分执行数据库备份脚本:
在这里插入图片描述

三、一键源码安装 LAMP脚本

#!/bin/bash
#auto install LAMP
#by wugk 2014-11
#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/
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
	if [ $? -eq 0 ];then
		make && make install
		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
	wget -c $M_URL/$M_FILES && tar -xzvf $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[32mThe $M_FILES_DIR Server Install Success !\033[0m"
	else
		echo -e "\033[32mThe $M_FILES_DIR Make or Make install ERROR,Please Check......"
		exit 0
	fi
fi

#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 "\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

四、for循环

4.1 打印 seq 数字循环

#!/bin/sh

for	i	in	`seq 15` do
	echo	“NUM is $idone

4.2求和 1-100 的 值

#!/bin/bash #auto sum 1 100 j=0
for ((i=1;i<=100;i++))
do
	j=`expr $i + $j`
done echo $j

4.3批量压缩

找到相关 log ,然后批量打包
打包最后的两个文件

#!/bin/sh
for	i	in	`find /var/log	-name	"*.log" | tail -2` 
do
tar	-czf	2014log.tgz $i 
done

批量解压:

#!/bin/sh
for	i	in	`find /var/log	-name	"*.gz"` 
do
tar	-zxvf	2014log.tgz $i 
done

4.4 批量传输文件

#!/bin/bash

#auto scp files for client #by authors wugk 2014 
for i in `seq 100 200` 
do
	scp -r /tmp/test.txt root@192.168.1.$i:/data/webapps/www
done

4.5远程主机批量执行命令

#!/bin/bash

#auto scp files for client 
#by authors wugk 2014 
for i in `seq 100 200` do
	ssh -l	root 192.168.1.$i	'ls /tmp'
done

五、while语句

5.1判断数字

#!/bin/sh 
i=1;
while [[ $i -lt 10 ]];do
	echo $i; ((i++));
done;

5.2 read 命令

read -p	'Please Input number:' input
输入一个数字
echo $input	

5.3逐行读取文件

#!/bin/sh
while read line 
do
	echo $line;
done </etc/hosts

文件:
在这里插入图片描述
在这里插入图片描述
结果:
在这里插入图片描述

六、case语句

6.1 until

直到满足条件才退出

#!/bin/sh a=10;
 
until [[ $a -lt 0 ]];
do 
	echo $a;
	((a--));
done;

6.2菜单选择

在这里插入图片描述
结果:
在这里插入图片描述

6.3 select选择语句

在这里插入图片描述
现在可以实现通过1、2、3来选择菜单了,而不是输入名称

七、数组和函数

先来定义一个一维数组:
A=( test1 test2 test3 ) ,定义数组一般以括号的方式来定义, 数组的值可以随机定义。如何来引用呢?

echo ${A[0]} ,代表引用第一个数组变量,结果会显示 test1, 数组引用从 0 开始,代表第一个数组,依次类推。

echo ${A[1]} ,代表引用第二个数组变量,结果会显示 test2, 数组引用也是从 0 开始计算的。

如何显示该数组所有参数呢? echo ${A[@]} 将显示所有参数 test1 test2 test3 。

如何显示该数组参数个数呢? echo ${#A[@]} 将显示该数组的参数
个数 3。

如果替换某个数组呢?例如替换第二个 test2 数组为 test5 :echo
${A[@]/test2/test5}

如何删除一个数组呢?例如删除 test3 数组命令为: unset A[2] ;echo ${A[@]} 查看效果。

案例一、

#!/bin/sh

#Auto Make KVM Virtualization #Auto config bond scripts 
eth_bond()
{

NETWORK=(

HWADDR=`ifconfig	eth0	|egrep	"HWaddr|Bcast"	|tr	"\n"	"	"|awk '{print $5,$7,$NF}'|sed -e 's/addr://g' -e 's/Mask://g'|awk
'{print $1}'`

IPADDR=`ifconfig	eth0	|egrep	"HWaddr|Bcast"	|tr	"\n"	"	"|awk '{print $5,$7,$NF}'|sed -e 's/addr://g' -e 's/Mask://g'|awk
'{print $2}'`

NETMASK=`ifconfig eth0 |egrep "HWaddr|Bcast" |tr "\n" " "|awk '{print $5,$7,$NF}'|sed -e 's/addr://g' -e 's/Mask://g'|awk '{print $3}'`
GATEWAY=`route -n|grep "UG"|awk '{print $2}'`

)

cat >ifcfg-bond0<<EOF DEVICE=bond0 BOOTPROTO=static
${NETWORK[1]}
 
${NETWORK[2]}

${NETWORK[3]} ONBOOT=yes TYPE=Ethernet NM_CONTROLLED=no EOF

案例二、
在这里插入图片描述

7.1 函数

函数的编写与调用:
在这里插入图片描述
在这里插入图片描述

八、sed和grep

8.1把168改成10

在这里插入图片描述
使用命令修改:
在这里插入图片描述

8.2在行首添加id+空格

在这里插入图片描述

8.3在行末添加空格+id

在这里插入图片描述

8.4在匹配到的上行或者下一行添加内容

在这里插入图片描述

8.5打印匹配到的行、打印第一行、打印1到5行

在这里插入图片描述

8.6找出最大的数字

在这里插入图片描述
将空格变成换行符:
在这里插入图片描述
排除空行:
在这里插入图片描述
排序:
在这里插入图片描述
取最小值和最大值:
在这里插入图片描述

8.7grep和grep -v

grep -v取没有匹配到的值。
在这里插入图片描述

8.8匹配以10开头的

在这里插入图片描述
匹配以11结尾的:
在这里插入图片描述

8.9匹配0-9:匹配a-z:

在这里插入图片描述

8.10匹配大写开头

在这里插入图片描述

8.11匹配ip

在这里插入图片描述
[(0到9匹配1到3次)+.] ----->匹配3次
最后还要匹配0-9一到3次,是为了防止192.165.3.这样的ip,以.结尾,而不是以数字结尾的非法ip
.

8.12打印匹配到的行号

在这里插入图片描述

8.13egrep,匹配11或者wuguangke

在这里插入图片描述

8.14awk打印第几列

在这里插入图片描述

8.15打印用户

在这里插入图片描述
也可以以:切割
在这里插入图片描述

8.16打印ip

在这里插入图片描述

8.16打印use

在这里插入图片描述

8.17打印时添加内容

$NF表示打印最后一列
在这里插入图片描述

8.18find命令

打印当前目录的文件、30天以前修改的,今天修改的。
在这里插入图片描述
在这里插入图片描述
大于20M的:
在这里插入图片描述
AWK SED GREP FIND四大剑客

九、linux系统全量和增量备份

全量备份:
在这里插入图片描述
备份的快照文件是/tmp/snapshot,备份的目录是/data/sh
现在,经过一段时间后,在/data/sh目录中增加了新的文件:
增量备份:
在这里插入图片描述
注意,快照文件必须是同一个才是增量备份,如果不是同一个快照文件,那么会进行全量备份
如果把这个目录删掉的话,先还原全量备份,再还原增量备份。

下面是实现周末进行完整备份,其它星期进行增量备份的脚本:

#!/bin/sh

#Automatic Backup Linux System Files #Author wugk 2013-11-22
#Define Variable SOURCE_DIR=(
$*
)

TARGET_DIR=/data/backup/ 
YEAR=`date +%Y` 
MONTH=`date +%m` 
DAY=`date +%d` 
WEEK=`date +%u` 
A_NAME=`date +%H%M` 
FILES=system_backup.tgz CODE=$?
if [ -z "$*" ];then

	echo	-e "\033[32mUsage:\nPlease   Enter	Your Backup Files	or Directories\n------------\n\nUsage: { $0 /boot /etc}\033[0m" 
	exit
fi

#Determine Whether the Target Directory Exists 
if [ ! -d $TARGET_DIR/$YEAR/$MONTH/$DAY ];then 
	mkdir -p $TARGET_DIR/$YEAR/$MONTH/$DAY 
	echo -e "\033[32mThe $TARGET_DIR Created Successfully !\033[0m" 
fi
#EXEC Full_Backup Function Command 
Full_Backup()
{

if [ "$WEEK" -eq "7" ];then

	rm -rf $TARGET_DIR/snapshot

	cd $TARGET_DIR/$YEAR/$MONTH/$DAY 
	tar -g $TARGET_DIR/snapshot -czvf $FILES ${SOURCE_DIR[@]}
 
	[ "$CODE" == "0" ]&&echo -e "\n\033[32mThese Full_Backup System Files Backup Successfully !\033[0m" 
fi
}

#Perform incremental BACKUP Function Command Add_Backup()
{

if [ $WEEK -ne "7" ];then

	cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;
	tar -g $TARGET_DIR/snapshot -czvf $A_NAME$FILES ${SOURCE_DIR[@]} 
	[ "$CODE" == "0" ]&&echo -e "\n\033[32mThese Add_Backup System Files $TARGET_DIR/$YEAR/$MONTH/$DAY/${YEAR}_$A_NAME$FILES Backup Successfully !\033[0m"
fi

}

sleep 3 Full_Backup;Add_Backup

十、linux下自动化企业运维案例

10.1封IP,对于暴力访问的机器

安装:
在这里插入图片描述
一直输入错误的密码:
在这里插入图片描述
监控这个文件:
在这里插入图片描述
有很多失败的访问信息:
在这里插入图片描述
提取数据:
在这里插入图片描述
将这个IP加入防火墙,并且重启防火墙:
在这里插入图片描述

脚本:
在这里插入图片描述
在这里插入图片描述

10.2同步文件到其它服务器

创建文件:
在这里插入图片描述
脚本:
在这里插入图片描述
在这里插入图片描述
执行:
在这里插入图片描述

10.3远程批量执行命令

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

10.4 RSync+SSH批量自动化部署

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

在这里插入图片描述
创建一个文件:
在这里插入图片描述
执行命令:
在这里插入图片描述
现在将www1中的文件全部同步到www2了。

十一、服务监控检查脚本发送邮件告警

脚本分解:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
上面的是list.txt中的,单个服务直接复制一份,改成$1即可

执行:

在这里插入图片描述
在这里插入图片描述
最后,在脚本前面添加参数检查:
在这里插入图片描述

十二、硬件信息收集

在这里插入图片描述

#!/bin/sh

#auto get system info #author wugk 2014-08-29 
echo -e "\033[34m \033[1m" cat <<EOF
 
++++++++++++++++++++++++++++++++++++++++++++++

++++++++Welcome to use system Collect+++++++++

++++++++++++++++++++++++++++++++++++++++++++++ EOF
ip_info=`ifconfig |grep "Bcast"|tail -1 |awk '{print $2}'|cut -d: -f 2` 
cpu_info1=`cat /proc/cpuinfo |grep 'model name'|tail -1 |awk -F: '{print $2}'|sed 's/^ //g'|awk '{print $1,$3,$4,$NF}'`

cpu_info2=`cat /proc/cpuinfo |grep "physical id"|sort |uniq -c|wc -l` serv_info=`hostname |tail -1`
disk_info=`fdisk -l|grep "Disk"|grep -v "identifier"|awk '{print $2,$3,$4}'|sed 's/,//g'`

mem_info=`free -m |grep "Mem"|awk '{print "Total",$1,$2"M"}'` load_info=`uptime |awk '{print "Current Load: "$(NF-2)}'|sed 's/\,//g'` mark_info='BeiJing_IDC'

echo -e "\033[32m----------------\033[1m"

echo IPADDR:${ip_info} echo HOSTNAME:$serv_info
echo CPU_INFO:${cpu_info1} X${cpu_info2} echo DISK_INFO:$disk_info
echo MEM_INFO:$mem_info echo LOAD_INFO:$load_info
echo -e "\033[32m-----------------------------\033[0m"
echo -e -n "\033[36mYou want to write the data to the databases? \033[1m" ;read ensure

if	[ "$ensure" == "yes" -o "$ensure" == "y" -o "$ensure" == "Y" ];then
	echo "-------------------------"

	echo -e	'\033[31mmysql -uaudit -p123456 -D audit -e ''' "insert into audit_audit_system values('','${ip_info}','$serv_info','${cpu_info1} \ X${cpu_info2}','$disk_info','$mem_info','$load_info','$mark_info')" '''\033[0m '

else
	echo "wait exit.	"
	exit

fi

也可以将信息存入csv文件:
在这里插入图片描述

CREATE TABLE `audit_audit_system` (
`id` int(11) NOT NULL AUTO_INCREMENT,

`ip_info` varchar(50) NOT NULL,

`serv_info` varchar(50) NOT NULL,

`cpu_info` varchar(50) NOT NULL,

`disk_info` varchar(50) NOT NULL,

`mem_info` varchar(50) NOT NULL,

`load_info` varchar(50) NOT NULL,

`mark_info` varchar(50) NOT NULL, PRIMARY KEY (`id`),
UNIQUE KEY `ip_info` (`ip_info`), UNIQUE KEY `ip_info_2` (`ip_info`)
);

十三、磁盘监控告警

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
学习链接:https://www.bilibili.com/video/BV1Ns411a7vx?p=1

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值