判断路径是不是非空
path=/server/backup
find ${path:/tmp} -name "*.tar.gz" -type f|xargs rm -f
rm -rf ${path}
计算变量长度
seq -s "100" 100 以空格为分隔符打出来100个数字,如果不加s,会以回车为分隔符
3个方法实现同样的功能
echo $(expr length "$chars") ==效率最高
ech0 ${#chars}
ech0 $chars |wc -m
变量的数值计算
(()) 常用的方法之一
执行简单的整数运算,只需将特定的算术表达式"$(("和"))" 括起
& 位的and
echo $((a+=1)) a=a+1
a++ 先输出a的值,然后计算自增
变量在前,先输出变量值,变量在后,就是先运算后输出变量的值
1,100的计算 echo $((100*(100+1)/2))
#/bin/sh
i=1
while a<=100
do
i=1,(i++)
done
ech0 $i
实现加减乘除等功能的计算器,通过命令行传参的方式实现
#/bin/sh
echo $(($1$2$3))
let赋值表达式
expr 2 + 2 计算功能
expr 判断变量是否为整数
bc命令 主要用于小数
shell 变量的输入
语法格式 read 参数 变量名 -p设置提示信息 -t 设置输入等待的时间
加减乘除的脚步改成通过read方式读入整数变量
#/bin/sh
while true
do
read -t 10 -p "pls input two number:" a b
expr $a +0 >/dev/null 2>&1
[ $? -ne 0 ] && continue
expr $b +0 >/dev/null 2>&1
[ $? -ne 0 ] && continue ||break
done
ech0 “a-b=$(( $a-$b ))”
ech0 “a+b =$(( $a+$b ))"
2
#/bin/sh
a="$1"
b="$2"
Usage () {
ech0 "Usage:sh $0 numl num2"
exit 1
}
if [ $# -ne 2 ];then
Usage
fi
1.3 条件测试
格式 [<测试表达式>] && || > < 等操作符可以用应用于[[]] 中
=和!=在[]中使用不需要转义
"-a" "-o" 逻辑操作符号用于[]中使用
"&&" "||" 逻辑操作符号用于[[]]中使用
判断条件后面执行多条命令 用{} 和()
[2 -ne 2] || {echo " im 1 " ; ech0 " im2 ";exit 1 ;}
1.3.2.4 test命令测试字符串
test -z "file1" ||echo 0=== [[-z "$file1 "]] ||echo 0
制作单级及多级菜单, cat 多行的输出
用了函数
cat menu.sh
单个菜单
menu() {
cat <<END
1.[ install lamp1]
2.[ install lamp2]
3.[ install lamp3]
please input the num that you want:
END
}
menu
read a
echo ”you selected $a "
多级菜单
cat <<END
1.[ install lamp1]
2.[ install lamp2]
3.[ install lamp3]
please input the num that you want:
END
read a
[ $a -eq 1 ] && {
cat << END
[ install lamp1]
[ install lamp1]
[ install lamp1]
END
}
read b
echo "you want to install $b.apache."
1.4 分支与循环结构
if 条件句
单分支结构语法
if [条件]
then
指令
fi
单分支if条件语句整数比较大小
#/bin/sh
a=12
b=13
if [$a -gt $b ]
then echo "$a <=$b "
fi
查看空闲内存
free -m |awk ‘/buffers\//{print $NF} ‘
双分支结构
if [条件]
then 指令
else 指令
fi
多分支结构
if [条件]
then 指令
elif 条件
then 指令
else 指令
fi
判断字符串是否为数字的方法 -n 非空字符串
[ -n "` echo 22 |sed ‘ s/[0-9]//g‘`" ] && echo 1 ||echo 0 第一个参数必须为数字
[ -n "` echo 22 |sed ‘ s/[0-9]//g‘`" ] && exit 1 参数必须为数字
[ -z "` echo 22 |sed ‘ s/[0-9]//g‘`" ] && echo 1 ||echo 0 -- 长度为0
expr 计算判断
expr $1+0 >/dev/null2>&1
[ $? -eq 0 ] && echo int
监控mysql服务的方案
方法1 netstat -lnt |grep 3306 ===不完美
netstat -lnt |grep 3306 |awk -F ‘[ :]+‘ ‘{ print $5 }‘
#!/bin/sh
PORT=`netstat -lnt |grep 3306 |awk -F ‘[ :]+‘ ‘{ print $5 }‘ `
if [$PORT -eq 3306 ] ===最好是字符串 [ "$PORT" != "3306" ]
then
echo "db is runing"
else
/data/3306/mysql restart ===根据实际情况来写
fi
方法2 netstat -lnt |grep 3306|wc -l
#!/bin/sh
PORTnum=`netstat -lnt |grep 3306 |wc -l `
if [$PORTnum -eq 1 ]
then
echo "db is runing"
else
/data/3306/mysql restart ===根据实际情况来写
fi
方法3 如果mysql端口和进程同时存在,即认为mysql服务正常
netstat -lntup |grep mysql |wc -l
ps -ef |grep mysqld |grep -v grep |wc -l
杀掉mysqld的循环
while true
do
killall mysqld > /dev/null 2>&1
[$? -ne 0] &&break
sleep 1
done
方法4 模拟web服务器,通过mysql账户连接mysql,然后根据返回命令状态或者内容确认mysql是否正常
例如 mysql -uroot -p‘oldboy‘ -S /data/3306/mysql.sock -ech0 -e "selecte version();" >&/dev/null
然后用 $? -eq 0 来判断,0是真,1位假
如果=0 提示数据库正在运行,如果不=0 杀进程,然后启动进程
异地连接的情况下
使用转义的比较符号
if [$? -eq 0 ] && [ $d -eq 2 ] && [$e -lt 5]
if [$? -eq 0 ] || [ $d -eq 2 ] || [$e -lt 5]
监控apache 端口监控
netstat -lnt |grep 80 |awk -F ‘[ :]+‘ ‘{ print $5 }‘
#!/bin/sh
PORT=`netstat -lnt |grep 80 |awk -F ‘[ :]+‘ ‘{ print $5 }‘ `
if [$PORT -eq 80 ] ===最好是字符串 [ "$PORT" != "3306" ]
then
echo "apache is runing"
else
/data/3306/mysql restart ===根据实际情况来写
fi
监控远程apche
使用 nmap ip -p 80 |grep open |wc -l
通过wget 判断 ..wget -T 10 -q --spider http://10.0.0.9 >&/dev/null
通过curl -s http://8.8.8.8 >&/dev/null
curl -I www.baidu.com 获取200的状态码
curl -I -s baidu.com |head -1 |cut -d " " -f2
加载函数库
cat check_web.sh
#!/bin/sh
[ -f /etc/init.d/functions ] && ./etc/init.d/functions ||exit 1
httpCode=`curl -I -s baidu.com |head -1 |cut -d " " -f2`
if [ "$httpCode" == "200"];then
action "nginx is runing." /bin/true
else
action "nginx is not runing." /bin/false
sleep 1
/appliaction/nginx/sbin/nginx && \
action "nginx is started." /bin/true
fi
传参的方法
#!/bin/sh
[ -f /etc/init.d/functions ] && ./etc/init.d/functions ||exit 1
if [$# -ne 1];then
echo "Usage:$0 argv"
exit 1
fi
httpCode=`curl -I -s $1 |head -1 |cut -d " " -f2`
if [ "$httpCode" == "200"];then
action "nginx is runing." /bin/true
else
action "nginx is not runing." /bin/false
sleep 1
/appliaction/nginx/sbin/nginx && \
action "nginx is started." /bin/true
fi
传参判断ip 和端口
#!/bin/sh
if [$# -ne 2];then
echo "Usage:$0 ip port"
exit 1
fi
HttpPortNum=`namp $1 -p $2 |grep open |grep -v grep |wc -l`
if [ $HttpPortNum -eq 1 ];then
echo "$1 $2 is open."
else
echo "$1 $2 is closed."
fi
查看远端端口是否开启
echo -e "\n" |telnet baidu.com 80 |grep Connected |wc -l
namp www.baidu.com -p 80
nc -w 5 www.baidu.com 80 && echo ok
case 结构条件句
case "字符串变量" in
值1 ) 指令
;;
值2 ) 指令
;;
*) 指令
esac
利用case语句开发apache/nginx HTTP服务启动脚本 ,可参看系统的portmap脚本
centos里面不一样,百度之
#!/bin/sh
httpd="启动路径 /appliaction/nginx/sbin/nginx"
./etc/init.d/functions
case "$1" in
start )
$httpd start >& /dev/null
[ $? -eq 0 ] && action "httpd is started " /bin/true ||\
action action "httpd is started " /bin/false
;;
stop )
$httpd stop >& /dev/null
[ $? -eq 0 ] && action "httpd is stoped " /bin/true ||\
action action "httpd is stoped " /bin/false
;;
restart )
$httpd restart >& /dev/null
[ $? -eq 0 ] && action "httpd is restarted " /bin/true ||\
action action "httpd is restarted " /bin/false
;;
* )
echo "Usage:$0 {start|stop|restart}"
exit
;;
esac
脚本添加到服务 为开机启动,即可以使用service命令来使用 chkconfig
需要学习的规范脚本
/etc/init.d/functions
/etc/rc.sysinit
/etc/init.d/nfs
/etc/init.d/httpd
mysql 多实例的启动
启动mysql服务器:./mysqld_safe --defaults-file=/etc/my.cnf --user=root 2>&1 > /dev/null &
还可以通过判断mysql.sock存在与否
比如/var/lib/mysql/mysql.sock
当型循环和直到新循环
while do 指令 done
until do 指令 done
whlie true 表示条件为真,会一直执行下去,也可以成为守护进程
usleep 微秒的意思
后台执行的程序,掉到前台用fg ,bg后台, jobs
ctrl c 停止 ctrl z 暂停
whlie语句计算1到100之和
#!/bin/sh
i=1
sum=0
while
(( i < = 100)) do
((sum=sum+i))
((i++))
done
[ -n "$sum" ] $$ printf "totalsum is :$sum\n"
或者i=100 ((sum=i*(i+1)/2)) 效率高
竖列打印10个数字 10 9 8... 1
#!/bin/sh
i=10
while ((i>0)) =====while [[$i > 0 ]]
do
ech0 $i
((i--))
done
分析apache日志,计算所有行的日志元素的访问总和
第八列就是大小
echo `awk ‘{print $ 10 }‘ access_2016.log |grep -v -|tr "\n" "+" |sed ’s#117+#117#g’` |bc
把换行替换为+,然后用sed替换+,以117+结尾的情况下 最后 用bc计算
sum=0
whlie read line
do
size=`echo $line |awk ‘{ print $10 }‘`
[ "$size" == "-" ] && continue
((sum=sum+$size))
done <access_2016.log ==结尾读取日志
开头读取日志
exec <access_2016.log
for 循环语句
echo 10.0.0.{5..1}
seq -s " " 5 -1 1 ====从5打到1
目录 获取 ls -F |grep /
for num in `ls -F |grep /`
do
echo $num
done
ls *.jpg |awk -F ‘分隔符‘ ‘{print $0 }‘
99乘法表
for i in {1..9}
do
for ((j=1;j<=9;j++))
do
echo -n "$j*$i=$(($j*$i)) "
if [ $j -ge $i ]
then
echo -e ‘\n‘
break
fi
done
done
LANG=en
chkconfig --list |grep 3:on|awk ‘{print $1}‘ ===开机启动
查询出来开机的,先全部关闭,然后再开启需要的
for oldboy in`chkconfig --list |grep 3:on|awk ‘{print $1}‘`
do
chkconfig --lever 3 $oldboy off
done
for oldboy in cron network syslog sshd
do
chkconfig --lever 3 $oldboy on
done
seq 有个步长的参数 seq 1 3 10 3是步长
seq -w 100
随机数 echo $RANDOM echo $(date +%N) openssl rand --base64 8|md5sum mkpasswd 8|md5sum
echo $(date +%N)$RANDOM|md5sum|cut -c 2-9
break continue exit 的例子
break n n表示跳出循环的层数,如果省略n表示跳出整个循环
continue 忽略本次循环的,进入循环的下一次循环
exit 不会执行循环下面的脚步
shell 函数
函数名(){
指令...
return n
}
执行的时候,直接执行函数名即可 $0比较特殊
函数传参转成脚本命令行传参 ,注意2个$1
#/bin/sh
if [ $# -ne 1 ]
then
echo "error" && exit 1$2$3
fi
functions Check_Url () {
curl -I -s $1 |head -1 && return 0||return 1$2$3
}
Check_Url $1
函数参考/etc/portmap,httpd 服务启动脚本
批量检查web url 并通过手机邮件报警
检查系统是否优化之一
# Source function library.-
. /etc/init.d/functions.
if
.grep 18030 /etc/sysconfig/il8njlwc -1‘ -eq 1 ] N
then"
action "/etc/sysconfig/il8n" /bin/true"
else.
action "/etc/sysconfig/il8n" /bin/false"
fi.
export LANG=en-
if [ ‘grep 65535 /etc/security/limits.conflwc -1‘ -eq 1 ]
then"
action "/etc/security/limits.conf" /bin/true.
else.
action "/etc/security/limits.conf" /bin/false.
fi
,1.7.1数组介绍、
数组就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集
合。这个名字成为数组名,编号成为下标。组成数组的各个变量成为数组的分量,也称为
数组的元素,有时也称为下标变量。、
如果有过用其它语言编程的经历,那么想必会熟悉数组的概念。由于有了数组,可以
用相同名字引用一系列变量,并用数字(索引)来识别它们。在许多场合,使用数组可以
缩短和简化程序,因为可以利用索引值设计一个循环,高效处理多种情况。杏
http://baike.baidu. com/view/209670.htm,
数组定义
array=(value1 value2 ...)
获取数组的长度
[[email protected] "I# echo ${#array[@]}
3
[[email protected] "]# echo ${#array[*]}
3
把#去掉可以获得整个数组内容 echo ${array[*]}
数组实例
[[email protected] scripts]# cat arr01_sh
array=(
oldboy
zhangyue
zhangyang
for ((i=0; i<${#array[*]}; i++))
do
echo ‘This is num $i,then content is ${array[$i]}‘
done
echo ----------------------
echo array len:${#array[*]}‘
function check url(){
for ((i=0;i<${#url_list[*]}; i++))
do
judge=($(curl -I -s --connect-timeout 2 ${url_list[$i]}head -1
if [ "${judge[1]}"=="200" -a "${judge[2]}"=="OK" ];then
action ‘${url-list[$i]} is successful /bin/true
else
action ‘${url-list[$i]} is failure /bin/false
fi
done
bash命令参数调色
-n -v -x 最后一个很有用,追踪脚步
1.8.2.6扩展内容shell调试小结:、
0)直接执行脚本根据报错来调试。、
1)要记得首先用dos2unix处理脚本、
2) sh -x/-n调试整个脚本、
3) set -x和set +x调试部分脚本(脚本中设置)、
4) echo内容输出然后;exit退出的方式,一步步跟踪脚本。、
5)最关键的是编码习惯,将错误扼杀在萌芽之中,降低减轻调试负担。