shell 企业编程基础

shell 企业编程基础
 
@@@shell脚本编程需要注意的几个事项:@@@
#shell脚本名称命名一般为英文的大写、小写;
#不能使用特殊符号、空格来命名;
#shell 脚本后缀以.sh结尾;
#不建议shell命名为纯数字,一般以脚本功能命名;
#shell脚本内容首先需以#!/bin/bash开头;
#shell脚本中变量名称使用大写字母,字母间不能使用“-”、“_”;
#shell脚本变量名称不能以数字、特殊符号开头。
 
一、shell 编程之变量
shell给一个变量赋值,实际上就是定义了变量,在linux支持的所有shell中,都可以用赋值符号“=”为变量赋值,shell为弱类型语言,定义变量不需要声明类型,如果在使用时需要明确变量的类型,可以使用declare指定类型,declare常见参数如下:
+/-        "-"可以用来指定变量的属性,“+”为取消变量所设的属性;
-f        仅显示函数;
r        将变量设置为只读;
x        指定的变量会成为环境变量,可供shell以外的程序使用;
i        指定类型为数值,字符串或运算式。
shell编程中变量分为3种:系统变量、环境变量、用户变量。其中系统变量在对参数判断和命令返回值判断时使用,而环境变量则主要是在程序运行时需要设置,用户变量又称为局部变量,多使用在shell脚本内部或者临时局部。
@@@ shell编程常见系统变量如下:@@@
$0        当前脚本的名称。
$n        当前脚本的第n个参数,n=1,2,3,...,9。
$*        当前脚本的所有参数(不包括程序本身)。
$#        当前脚本的参数(不包括程序本身)。
$?        命令或程序执行完后的状态,返回0表示执行成功。
$$        程序本身的PID号。
@@@ shell 编程常环境变量如下:@@@
PATH        命令所示路径,以冒号为分割。
HOME        打印用户家目录。
SHELL        显示当前shell 类型。
USER        打印当前用户名。
ID        打印当前用户ID信息。
PWD        显示当前所在路径。
TERM        打印当前终端类型。
HOSTNAME        显示当前主机名。
@@@ shell 编程用户变量如下:@@@
A=tang.com        自定义变量A。
N_SOFT=nginx-1.12.0.tar.gz        自定义变量N_SOFT。
BACK_DIR=/data/backup/        自定义变量BACK_DIR。
IP1=192.168.10.9                自定义变量IP1。
IP2=192.168.10.10                自定义变量IP2。
 
二、if 条件语句实战
if条件判断语句,通常以if开头,fi结尾。也可加入else或者elif进行多条件的判断,if表达式格式如下:
if (表达式)
语句1
else        
语句2
fi
if语句shell脚本编程案例:
1、比较两个整数的大小:
#!/bin/bash
#比较两个整数的大小
NUM = 100
if (($NUM > 4)) ;then
echo“The Num $NUM more than 4.”
else
echo"The Num $NUM less than 4."
fi
2、判断系统目录是否存在:
#!/bin/bash
# 判断系统目录是否存在
if [ ! -d/data/20181111 -a ! -d /tmp/20181110/ ] ; then
mkdir -p /data/20181111
@@@ if 常见的判断逻辑运算符详解:@@@
-f        判断文件是否存在,例如:[-f filename ]
-d        判断目录是否存在,例如:[ -d dirname ]
-eq        等于,应用于整型比较,即equal
-ne        不等于,应用于整型比较,即noequal
-lt        小于,应用于整型比较,即letter
-gt        大于,应用于整型比较,即greater
-le        小于或等于,应用于整型比较
-ge        大于或等于,应用于整型比较
-a        双方都成立(and),用法为逻辑表达式-a 逻辑表达式
-o        单方成立(or),用法为逻辑表达式-o 逻辑表达式
-z        空字符串
 ||        单方成立
&&        双方都成立表达式
3、if 多个条件测试分数判断:
#!/bin/bash
#多个条件测试分数判断
scores=$1
if [[ $scores -eq 100]]; then
echo"very good!";
elif [[ $scores -gt 85]]; then
echo"good!";
elif [[ $scores -gt 60]]; then
echo"pass!";
elif [[ $scores -lt60]]; then
echo"no pass!"
fi
@@@ if 判断括号区别 @@@
()        用于多个命令、命令替换、初始化数组。
(())        整数扩展、运算符、重定义变量值,算术运算比较。
[]        bash内部命令,正则字符范围、引用数组元素编号,不支持+- * / 数学运算符,逻辑测试使用-a -o 。
[[]]        bash程序语言的关键字,不是一个命令,[[]]结构比[]结构更加通用,不支持+- * / 数学运算符,逻辑测试使用 && || 。
{}        主要用于命令集合或者范围,例如:mkdir -p/data/201{7,8}/。
4、MySQL数据库备份脚本
#!/bin/bash
#auto backup mysql
#Define PATH 定义变量
BAKDIR=/data/backup/mysql/`date+%Y-%m-%d`
MYSQLDB=webapp
MYSQLPW=backup
MYSQLUSR=backup
#must use root user runscripts 必须使用root用户运行,$UID为系统变量
if [ $UID -ne 0 ]; then
echo'This script must use the root user !!!'
sleep2
exit0
fi
#Ddfine DIR and mkdirDIR 判断目录是否存在,不存在则新建
if [ ! -d $BACKDIR ];then
mkdir-p $BAKDIR
fi
#Use msyqldump backupDatabases
/usr/bin/mysqldump-u$MYSQLUSR -p$MSYQLPW -d $MSYQLDB > $BAKDIR/webapp_db.sql
echo "The msyqlbackup successfully"
 
三、for 循环语句实战
for循环语句主要用于对某个数据域进行循环读取、对文件进行遍历,通常用于循环某个文件或者列表。其语法格式以for---do开头,done结尾。
for var in (表达式)
do
语句1
done
for循环语句shell脚本编程案例:
1、循环打印BAT企业官网:
#!/bin/bash
#循环打印BAT企业官网
for website in www.baidu.com www.taobao.com www.qq.com
do
echo$website
done
2、循环打印1~100数字,seq表示列出数据范围:
#!/bin/bash
#循环打印1~100数字
for i in `seq 1 100`
do
echo"NUM is $i"
done
3、for 循环求1~100的总和:
#!/bin/bash
#求1~100的总和
j=0
for ((i=1; i<=100;i++))
do
j=`expr$i + $j`
done
echo $j
4、对系统日志文件进行分组打包:
#!/bin/bash
#对系统日志文件进行分组打包
for i in `find /var/log-name "*.log"`
do
tar-czf 2018_log$i.tgz $i
done
5、for循环批量远程主机文件传输:
#!/bin/bash
#批量远程主机文件传输
for i in `seq 100 200`
do
scp-r /tmp/tang.txt root@192.168.10.$i:/data/webapps/www
done
6、for循环批量远程主机执行命令:
#!/bin/bash
#批量远程主机执行命令
for i in `seq 100 200`
do
ssh-l root 192.168.10.$i `ls /tmp`
done
7、for循环打印10s等待提示:
for ((j=0; j<=10;j++))
do
echo-ne "\033[32m-\033[0m"
sleep1
done
echo
 
四、while循环语句实战
while循环语句与for循环功能类似,主要用于对某个数据域进行循环读取、对文件进行遍历,通常用于循环某个文件或者列表,满足循环条件会一直循环,不满足则退出循环,其语法格式以while---do开头,done结尾。
while (表达式)
do
语句1
done
while循环语句shell脚本编程案例如下:
1、循环打印BAT企业官网,read指令用于读取或者读取变量:
#!/bin/bash
#循环打印BAT企业官网
while read line
do
echo$line
done < tang.txt                tang.txt内容 echo -e "www.baidu.com\nwww.taobao.com\nwww.qq.com">tang.txt
2、while无限每秒输出HelloWorld:
#!/bin/bash
#无限每秒输出Hello World!
while sleep 1
do
echo-e "\033[32mHello World !\033[0m"
done
3、循环打印1~100数字,expr用于运算逻辑工具:
#!/bin/bash
#循环打印1~100数字
j=0
i=1
while ((i<=100))
do
j=`expr$i + $j`
((i++))
done
echo $j
4、while循环求1~100的总和:
#!/bin/bash
#求1~100的总和
j=0
i=1
while ((i<=100))
do
j=`expr$i + $j`
((i++))
done
echo $j
5、while循环逐行读取文件:
#!/bin/bash
#逐行读取文件
while read line
do
echo$line;
done < /etc/hosts
6、while循环判断输入IP的正确性:
#!/bin/bash
#判断输入IP的正确性
read -p "Pleaseenter ip Address,example 192.168.0.10 ip": IPADDR
echo $IPADDR|grep -v"[Aa-Zz]"|grep --color -E "([0-9]{1,3}\.){3}[0-9]{1,3}"
while [ $? -ne 0 ]
do
read-p "Please enter ip Address,example 192.168.0.10 ip": IPADDR
echo$IPADDR|grep -v "[Aa-Zz]"|grep --color -E"([0-9]{1,3}\.){3}[0-9]{1,3}"
done
7、每5s循环判断/etc/passwd是否被非法修改:
#!/bin/bash
#每5s循环判断/etc/passwd是否被非法修改
FILES="/etc/passwd"
while true
do
echo"The Time is `date +%F-%T`"
OLD=`md5sum$FILES|cut -d" " -f 1`
sleep5
NEW=`md5sum$FILES|cut -d" " -f 1`
if[[ $OLD != $NEW ]]; then
echo"The $FILES has been modified."
fi
done
8、每10s循环判断tang用户是否登录系统:
#!/bin/bash
#每10s循环判断tang用户是否登录系统
USERS="tang"
while true
do
echo"The Time is `date +%F-%T`"
sleep10
NUM=`who|grep" $USERS"|wc -l`
if[[ $NUM -ge 1 ]]; then
echo"The $USERS is login in system."
fi
done
 
五、case选择语句实战
case选择语句主要用于对多个选择条件进行匹配输出,与if---elif语句结构类似,通常用于脚本传递输入参数,打印出输出结果及内容,其语法格式以case---in开头,esac结尾。
#!/bin/bash
case $1 in
Pattern1)
语句1
;;
Pattern2)
语句2
;;
Pattern3)
语句3
;;
esac
case条件语句shell脚本编程案例:
1、打印monitor及archive选择菜单:
#!/bin/bash
#打印monitor及archive选择菜单
case $1 in
monitor)
monitor_log
;;
archive)
archive_log)
;;
help)
echo-e "\033[32mUsage:{$0 monitor|archive|help}\033[0m"
;;
*)
echo-e "\033[32mUsage:{$0 monitor|archive|help}\033[0m"
esac
2、自动修改IP脚本菜单:
#!/bin/bash
#自动修改IP脚本菜单
case $i in
modify_ip)
change_ip
;;
modify_hosts)
change_hosts
;;
exit)
exit
;;
*)
echo-e "1) modify_ip\n2) modify_hosts\n3) exit"
esac
 
六、select 选择语句实战
select语句一般用于选择,常用于选择菜单的创建,可以配合PS3来做打印菜单的输出信息,其语法格式以select---in do 开头,done结尾。
select i in (表达式)
do
语句
done
select 选择语句shell脚本编程案例:
1、打印开源操作系统选择:
#!/bin/bash
#打印开源操作系统选择
PS3="What you likemost of the open source system?"
select i in CentOSRedHat Ubuntu
do
echo"Your Select System: " $i
done
2、打印LAMP选择菜单:
#!/bin/bash
#打印LAMP选择菜单
PS3="Please enteryou select install menu:"
select i in http phpmysql quit
do
case $i in
http)
echoTest Httpd
;;
php)
echoTest PHP
;;
mysql)
echoTest MySQL
;;
quit)
echoThe System exit
exit
esac
done
 
七、shell 编程函数实战
shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数,shell函数的好处在于只需要定义一次,后期随时使用,无须在shell脚本中添加重复的语句块,其语法格式为以"functionname(){"开头,以"}"结尾。
shell编程函数默认不能将参数传入()内部,shell函数参数传递在调用函数名称时传递,例如:nameargv1 argv2 具体如下:
function name (){
command1
command2
....
}
name argv1 argv2
1、创建Apache软件安装函数,给函数Apache_install传递参数1,代码如下:
#!/bin/bash
#auto install LAMP
#HTTPD define pathvariable
H_FILES=httpd-2.2.31.tar.bz2
H_FILES_DIR=httpd-2.2.31
H_URL=http://mirrors.cnnic.cn/apache/httpd/
H_PREFIX=/usr/local/apache2/
functionApache_install(){
#Install httpd webserver
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"\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,PleaseCheck....."
exit0
fi
fi
}
Apache_install 1
2、创建tang_ip判断IP函数:
#!/bin/bash
#创建tang_ip判断IP函数
tang_ip(){
read-p "Please enter ip Address,example 192.168.0.10 ip :" IPADDR
echo$IPADDR|grep -v "[Aa-Zz]"|grep --color -E"([0-9]{1,3}\.){3}[0-9]{1,3}"
}
tang_ip