IF语句
1. 表达式
if ( 表达式)
语句1
else
语句2
fi
2. 比较两个整数大小
#!/bin/bash
NUM = 100
if (( $NUM > 4 )) ; then
echo “The Num $NUM more than 4 .”
else
echo “The Num $NUM less than 4 .”
fi
3. 判断系统目录是否存在
\ #! /bin/bash
\ #judge DIR or Files
\ #By author jfedu.net 2017
if [ ! -d /data/20140515 -a ! -d /tmp/2017/ ] ; then
mkdir -p /data/20140515
fi
4. If常见判断逻辑运算符详解
-f 判断文件是否存在 eg: if [ -f filename ];
-d 判断目录是否存在 eg: if [ -d dir ];
-eq 等于,应用于整型比较 equal;
-ne 不等于,应用于整型比较 not equal;
-lt 小于,应用于整型比较 less than;
-gt 大于,应用于整型比较 greater than;
-le 小于或等于,应用于整型比较;
-ge 大于或等于,应用于整型比较;
-a 双方都成立(and) 逻辑表达式 –a 逻辑表达式;
-o 单方成立(or) 逻辑表达式 –o 逻辑表达式;
-z 空字符串;
|| 单方成立;
&& 双方都成立表达式。
5. if多个条件测试分数判断
#!/bin/bash
\ #By author jfedu.net 2017
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
6. If判断括号区别
在使用if语句时,经常会使用()、(())、[]、[[]]、{}等括号,如下为几种括号简单区别对比:
( )
用于多个命令组、命令替换、初始化数组;
(( ))
例如:(( $NUM > 4 ))
整数扩展、运算符、重定义变量值,算术运算比较;
[]
例如:[ ! -d /data/20140515 -a ! -d /tmp/2017/ ]
bash内部命令,[与test是等同的,正则字符范围、引用数组元素编号,不支持+-*/数学运算符,逻辑测试使用-a、-o。
[[ ]]
例如:[[ $scores -eq 100 ]]
bash程序语言的关键字,不是一个命令,[[ ]]结构比[ ]结构更加通用,不支持+-*/数学运算符,逻辑测试使用&&、||。
{}
主要用于命令集合或者范围,例如mkdir -p /data/201{7,8}/
for循环
0. 1-100的和
#!/bin/bash
j = 0
for (( i= 1 ; i<= 100 ; i++ ))
do
j = ` expr $i + $j`
done
echo $j
1. for循环打印10秒等待
#!/bin/bash
for (( i= 1 ; i<= 10 ; i++ ))
do
echo -ne "\033 [32m-\033 [0m"
sleep 1
done
2. For循环批量远程主机执行命令
#!/bin/bash
for i in ` seq 100 200 `
do
ssh -l root 192.168 .1.$i ‘ls /tmp’
done
3.备份数据库(可crontab来设置定时备份)
grant zabbix,discuz,wordpress tables on *.* to username@'localhost' identified by "password" ;
flush privileges;
3.1 备份数据库V1版本(可crontab来设置定时备份)
首先判断数据库备份目录是否存在,不存在创建
导出数据库
判断导出是否成功,进行提示
SQL_DB = zabbix
SQL_USR = root
SQL_PWD = 123456
SQL_CMD = "/usr/local/mysql55/bin/mysqldump"
SQL_DIR = "/opt/sh/` date + %F` "
if [ ! -d $SQL_DIR ] ; then
mkdir -p $SQL_DIR
echo -e "\033 [32m The dir $SQL_DIR succeded\033 [0m"
fi
$SQL_CMD -u$SQL_USR -p$SQL_PWD $SQL_DB > $SQL_DIR /${SQL_DB} .sql
if [ $? -eq 0 ] ; then
echo -e "\033 [32m----------------\033 [0m"
echo -e "\033 [32mThe mysql ${SQL_DB} database backup succeded\033 [0m"
ls -l $SQL_DIR
else
echo -e "\033 [32m----------------\033 [0m"
echo -e "\033 [32mThe mysql ${SQL_DB} database backup filed \033 [0m"
ls -l $SQL_DIR
fi
3.2 备份数据库V2版本(可crontab来设置定时备份)
循环备份多个数据库(需要手动指定),备份好后显示备份成功的数据库并ls显示
V1和V2的区别是增加了循环备份,可以备份多个数据库
[ root@localhost sh]
SQL_DB = "$* "
SQL_USR = root
SQL_PWD = 123456
SQL_CMD = "/usr/local/mysql55/bin/mysqldump"
SQL_DIR = "/opt/sh/` date +%F` "
if [ $# -eq 0 ] ; then
echo -e "\033 [31m----------------\033 [0m"
echo -e "\033 [31mUsage:{/bin/bash $0 discuz|wordpress|zabbix|test}|help}\033 [0m"
exit
fi
if [ ! -d $SQL_DIR ] ; then
mkdir -p $SQL_DIR
echo -e "\033 [32m The dir $SQL_DIR succeded\033 [0m"
fi
for i in $SQL_DB
do
$SQL_CMD -u$SQL_USR -p$SQL_PWD $i > $SQL_DIR /${i} .sql
if [ $? -eq 0 ] ; then
echo -e "\033 [32m----------------\033 [0m"
echo -e "\033 [32mThe mysql \033 [31m${i} \033 [32m database backup succeded\033 [0m"
ls -l $SQL_DIR
else
echo -e "\033 [32m----------------\033 [0m"
echo -e "\033 [32mThe mysql ${i} database backup filed \033 [0m"
rm -rf $SQL_DIR /${i} .sql
echo -e "\033 [32mls -l $SQL_DIR \033 [0m"
ls -l $SQL_DIR
fi
done
结果:
[ root@localhost sh]
The mysql wordpress database backup succeded
total 12364
-rw-r--r-- 1 root root 425768 May 21 20 :39 wordpress.sql
-rw-r--r-- 1 root root 12231628 May 21 20 :38 zabbix.sql
The mysql zabbix database backup succeded
total 12364
-rw-r--r-- 1 root root 425768 May 21 20 :39 wordpress.sql
-rw-r--r-- 1 root root 12233027 May 21 20 :39 zabbix.sql
3.3备份数据库V3版本(可crontab来设置定时备份)
SQL_DB = "$* "
SQL_USR = root
SQL_PWD = 123456
SQL_CMD = "/usr/local/mysql55/bin/mysqldump"
SQL_DIR = "/opt/sh/` date +%F` "
if [ $# -eq 0 ] ; then
echo -e "\033 [31m----------------\033 [0m"
echo -e "\033 [31mUsage:{/bin/bash $0 discuz|wordpress|zabbix|test}|help}\033 [0m"
exit
fi
if [ ! -d $SQL_DIR ] ; then
mkdir -p $SQL_DIR
echo -e "\033 [32m The dir $SQL_DIR succeded\033 [0m"
fi
if [ $1 == "all" ] ; then
$SQL_CMD -u$SQL_USR -p$SQL_PWD --all-databases > $SQL_DIR /${SQL_DB} .sql
if [ $? -eq 0 ] ; then
echo -e "\033 [32m------------------\033 [0m"
echo -e "\033 [32mThe mysql ${SQL_DB} database backup succeded.\033 [0m"
ls -l $SQL_DIR
exit
else
echo -e "\033 [32m ------------------\033 [0m"
echo -e "\033 [32mThe mysql ${SQL_DB} database backup failed check\033 [0m"
rm -rf $SQL_DIR /${SQL_DB} .sql
ls -l $SQL_DIR
exit
fi
fi
for i in $SQL_DB
do
$SQL_CMD -u$SQL_USR -p$SQL_PWD $i > $SQL_DIR /${i} .sql
if [ $? -eq 0 ] ; then
echo -e "\033 [32m----------------\033 [0m"
echo -e "\033 [32mThe mysql \033 [31m${i} \033 [32m database backup succeded\033 [0m"
ls -l $SQL_DIR
else
echo -e "\033 [32m----------------\033 [0m"
echo -e "\033 [32mThe mysql ${i} database backup filed \033 [0m"
rm -rf $SQL_DIR /${i} .sql
echo -e "\033 [32mls -l $SQL_DIR \033 [0m"
ls -l $SQL_DIR
fi
done
while
语法格式
while ( 表达式)
do
语句1
done
1. 循环打印文件中的内容
#!/bin/bash
while read LINE
do
echo $LINE
done < aa.txt
[ root@localhost sh]
aaaaaa
bbbbbb
cccccc
dddddd
2. while无限每秒输出内容
#!/bin/bash
while sleep 1
do
echo -e "\033 [31mhahaha \033 [0m"
done
[ root@localhost sh]
hahaha
hahaha
hahaha
3.循环打印1-100数字,expr用于运算逻辑工具
#!/bin/bash
i = 0
while (( i<= 100 ))
do
echo $i
i = ` expr $i + 1 `
done
4. 循环求1-100和
#!/bin/bash
sum = 0
i = 1
while (( i<= 100 ))
do
sum = ` expr $sum + $i`
i = ` expr $i + 1 `
done
[ root@localhost sh]
5050
5. 判断IP输入正确性,简易版
#!/bin/bash
read -p "Please enter ip Address,example 192.168.128.1 ip:" IPADDR
echo $IPADDR | grep -v "[Az-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.128.1 ip:" IPADDR
echo $IPADDR | grep -v "[Az-Zz]" | grep --color -E "([0-9]{1,3}\.){3}[0-9]{1,3}"
echo "while{$IPADDR }"
done
判断IP数字是否合格
if [ $? -eq 0 ] ; then
IP = ( ` echo $IPADDR| sed 's/\./ /g' ` )
IP1 = ` echo ${ IP[ 0 ] } `
IP2 = ` echo ${ IP[ 1 ] } `
IP3 = ` echo ${ IP[ 2 ] } `
IP4 = ` echo ${ IP[ 3 ] } `
if [ $IP1 -gt 0 -a $IP1 -le 255 -a $IP2 -gt 0 -a $IP2 -le 255 -a $IP3 -gt 0 -a $IP3 -le 255 -a $IP4 -gt 0 -a $IP4 -le 255 ] ; then
break ;
fi
fi
6. 每五秒循环判断/etc/shadow是否被非法修改
#!/bin/bash
i = 0
FILES = "/etc/shadow"
while (( $i< 1 ))
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
CASE语句
语法格式
#!/bin/bash
case $1 in
Pattern1)
语句1
; ;
Pattern2)
语句2
; ;
Pattern3)
语句3
; ;
esac
1. 打印菜单
#!/bin/bash
case $1 in
monitor)
echo "monitor_log"
; ;
archive)
echo "archive_log"
; ;
help )
echo -e "\033 [32mUsage:{$0 monitor | archive | help... }\033 [0m"
; ;
*)
echo -e "\033 [32mUsage:{$0 monitor | archive | help }\033 [0m"
esac
Shell编程函数
Shell允许将一组命令集或语句形成一个可用块,这些块称为Shell函数,Shell函数的用于在于只需定义一次,后期随时使用即可,无需在Shell脚本中添加重复的语句块,其语法格式以function name(){开头,以}结尾。
Shell编程函数默认不能将参数传入()内部,Shell函数参数传递在调用函数名称传递,例如name args1 args2。
例:
function name (){
command1
command2
........
}
name args1 args2
1. 创建Nginx软件安装函数,给函数传递参数1
#!/bin/bash
H_FILES = nginx-1.18.0.tar.gz
H_FILES_DIR = nginx-1.18.0
H_URL = http://nginx.org/download/
H_PREFIX = /usr/local/apache2/
function Nginx_install ( ) {
if [ [ "$1 " -eq 1 ] ] ; then
wget -c $H_URL /$H_FILES && tar -xf $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...\033 [0m"
exit 0
fi
fi
}
Nginx_install 1
2. 创建判断IP函数
#!/bin/bash
judge_ip ( ) {
read -p "Please enter ip Address" : IPADDR
echo $IPADDR | grep -v "[Aa-Az]" | grep --color -E "([0-9]{1,3}\.){3}[0-9]{1,3}"
}
judge_ip