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 [ $
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 [ $
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
#expr后面必须空格
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中的"."替换为空格,例如:192 168 203 1
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= 0FILES= "/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." fidone
CASE语句
语法格式
#!/bin/bash#By author jfedu.net 2017case $1 in Pattern1) 语句1 ;; Pattern2) 语句2 ;; Pattern3) 语句3 ;; esac
1. 打印菜单
#!/bin/bashcase $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 (){ command1command2 ........}name args1 args2
1. 创建Nginx软件安装函数,给函数传递参数1
#!/bin/bashH_FILES=nginx-1.18.0.tar.gzH_FILES_DIR=nginx-1.18.0H_URL=http://nginx.org/download/H_PREFIX=/usr/local/apache2/function Nginx_install(){ #install nginx web server if [[ "$1" -eq 1 ]];then wget -c $H_URL/$H_FILES && tar -xf $H_FILES && cd $H_FILES_DIR && ./configure --prefix=$H_PREFIX #下载失败返回为0,下载失败而不是报错所以也会返回0 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/bashjudge_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
Linux
1
,
1,
1 , #,
∗
,
*,
∗ ,
,
,
, ?..的含义
$
$`` 0` ` 是脚本本身的名字
$` ` 1` ` 是传递给该shell脚本的第一个参数
$` ` 2` ` 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过` ` 9` ` 个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,` ` 0` `表示没有错误,其他表示有错误