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、比较两个整数的大小:
NUM = 100
if (($NUM > 4)) ; then
echo “The Num $NUM more than 4.”
else
echo "The Num $NUM less than 4."
fi
2、判断系统目录是否存在:
if [ ! -d /data/20181111 -a ! -d /tmp/20181110/ ] ; then
mkdir -p /data/20181111
@@@ if 常见的判断逻辑运算符详解:@@@
-f 判断文件是否存在,例如:[ -f filename ]
-d 判断目录是否存在,例如:[ -d dirname ]
-eq 等于,应用于整型比较,即equal
-ne 不等于,应用于整型比较,即no equal
-lt 小于,应用于整型比较,即letter
-gt 大于,应用于整型比较,即greater
-le 小于或等于,应用于整型比较
-ge 大于或等于,应用于整型比较
-a 双方都成立(and),用法为逻辑表达式 -a 逻辑表达式
-o 单方成立(or),用法为逻辑表达式 -o 逻辑表达式
-z 空字符串
|| 单方成立
&& 双方都成立表达式
3、if 多个条件测试分数判断:
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 -lt 60]]; then
echo "no pass!"
fi
@@@ if 判断括号区别 @@@
() 用于多个命令、命令替换、初始化数组。
(()) 整数扩展、运算符、重定义变量值,算术运算比较。
[ ] bash内部命令,正则字符范围、引用数组元素编号,不支持+ - * / 数学运算符,逻辑测试使用-a -o 。
[[ ]] bash程序语言的关键字,不是一个命令,[[]]结构比[]结构更加通用,不支持+ - * / 数学运算符,逻辑测试使用 && || 。
{ } 主要用于命令集合或者范围,例如:mkdir -p /data/201{7,8}/。
4、MySQL数据库备份脚本
BAKDIR=/data/backup/mysql/`date +%Y-%m-%d`
MYSQLDB=webapp
MYSQLPW=backup
MYSQLUSR=backup
if [ $UID -ne 0 ]; then
echo 'This script must use the root user !!!'
sleep2
exit 0
fi
if [ ! -d $BACKDIR ]; then
mkdir -p $BAKDIR
fi
/usr/bin/mysqldump -u$MYSQLUSR -p$MSYQLPW -d $MSYQLDB > $BAKDIR/webapp_db.sql
echo "The msyql backup successfully"
三、for 循环语句实战
for循环语句主要用于对某个数据域进行循环读取、对文件进行遍历,通常用于循环某个文件或者列表。其语法格式以for---do开头,done结尾。
for var in (表达式)
do
语句1
done
for循环语句shell脚本编程案例:
1、循环打印BAT企业官网:
for website in www.baidu.com www.taobao.com www.qq.com
do
echo $website
done
2、循环打印1~100数字,seq表示列出数据范围:
for i in `seq 1 100`
do
echo "NUM is $i"
done
3、for 循环求1~100的总和:
j=0
for ((i=1; i<=100; i++))
do
j=`expr $i + $j`
done
echo $j
4、对系统日志文件进行分组打包:
for i in `find /var/log -name "*.log"`
do
tar -czf 2018_log$i.tgz $i
done
5、for循环批量远程主机文件传输:
for i in `seq 100 200`
do
scp -r /tmp/tang.txt root@192.168.10.$i:/data/webapps/www
done
6、for循环批量远程主机执行命令:
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"
sleep 1
done
echo
四、while循环语句实战
while循环语句与for循环功能类似,主要用于对某个数据域进行循环读取、对文件进行遍历,通常用于循环某个文件或者列表,满足循环条件会一直循环,不满足则退出循环,其语法格式以while---do开头,done结尾。
while (表达式)
do
语句1
done
while循环语句shell脚本编程案例如下:
1、循环打印BAT企业官网,read指令用于读取或者读取变量:
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无限每秒输出Hello World:
while sleep 1
do
echo -e "\033[32mHello World !\033[0m"
done
3、循环打印1~100数字,expr用于运算逻辑工具:
j=0
i=1
while ((i<=100))
do
j=`expr $i + $j`
((i++))
done
echo $j
4、while循环求1~100的总和:
j=0
i=1
while ((i<=100))
do
j=`expr $i + $j`
((i++))
done
echo $j
5、while循环逐行读取文件:
while read line
do
echo $line;
done < /etc/hosts
6、while循环判断输入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}"
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是否被非法修改:
FILES="/etc/passwd"
while true
do
echo "The Time is `date +%F-%T`"
OLD=`md5sum $FILES|cut -d" " -f 1`
sleep 5
NEW=`md5sum $FILES|cut -d" " -f 1`
if [[ $OLD != $NEW ]]; then
echo "The $FILES has been modified."
fi
done
8、每10s循环判断tang用户是否登录系统:
USERS="tang"
while true
do
echo "The Time is `date +%F-%T`"
sleep 10
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结尾。
case $1 in
Pattern1)
语句1
;;
Pattern2)
语句2
;;
Pattern3)
语句3
;;
esac
case条件语句shell脚本编程案例:
1、打印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脚本菜单:
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、打印开源操作系统选择:
PS3="What you like most of the open source system?"
select i in CentOS RedHat Ubuntu
do
echo "Your Select System: " $i
done
2、打印LAMP选择菜单:
PS3="Please enter you select install menu:"
select i in http php mysql quit
do
case $i in
http)
echo Test Httpd
;;
php)
echo Test PHP
;;
mysql)
echo Test MySQL
;;
quit)
echo The System exit
exit
esac
done
七、shell 编程函数实战
shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数,shell函数的好处在于只需要定义一次,后期随时使用,无须在shell脚本中添加重复的语句块,其语法格式为以"function name(){"开头,以"}"结尾。
shell编程函数默认不能将参数传入()内部,shell函数参数传递在调用函数名称时传递,例如:name argv1 argv2 具体如下:
function name (){
command1
command2
....
}
name argv1 argv2
1、创建Apache 软件安装函数,给函数Apache_install传递参数1,代码如下:
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/
function Apache_install(){
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,Please Check....."
exit 0
fi
fi
}
Apache_install 1
2、创建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