shell细节决定高度
1.文件测试操作符
-f[file]:文件存在且为普通文件则为真;
-d[directory]:文件存在且为目录文件则为真;
-s[size]:文件存在且为文件大小不为0则为真;
-e[exist]:文件存在则为真,比-f和-d加起来还要宽泛.
man test # 寻找系统文档帮助
# 高效简洁的判断
file1=/etc/service
file2=/etc/rc.local
[ -f "$file1" ] && echo 1 || echo 0
[ -f /etc/sysconfig/network ] && ./etc/sysconfig/network
[ -f "$file2" ] || exit 5
&&连接的两条命令,是'生死与共'的关系,前一条执行正确,后面的就跟着执行;
||连接的两条命令,是'你死我活'的关系,前一条执行结果为假,后面的才执行.
[ $1 -eq 3 ] || { echo "input";echo "is'not";echo "3";}
2.字符串测试操作符
-z "字符串":若串长度为0则为真,-z zero;
-n "字符串":若串长度不为0则为真,-n nonzero;
"串1" = "串2":若串1等于串2则为真,可以用"=="代替"=";
"串1" != "串2":若串1不等于串2则为真,不能用"!=="代替"!=",意思是:只存在"!=",不存在"!=="这种写法.
[ -z "$NFS_V2" ] && NFS_V2=default # 如果变量为空,就给个默认值
注意:
a.字符串操作符务必用双引号引起来;
b.比较符号的两端必须有空格.
不加空格的反例:
[ "asd"=="1" ]&& echo 1 || echo 0
1
[ "asd" == "1" ]&& echo 1 || echo 0
0
3.整数比较操作符
在[]以及test中使用的比较符:-eq、-gt、-lt等;
在(())以及[[]]中使用的比较符(数学符号):=、>、<等;
整数比较不用加双引号了;[[]]用-eq的写法也是对的,[[]]用>写法也可能不对,只会比较第一位,逻辑结果不对;
所以整数比较最好用-eq、-gt、-lt等.
[[ 2 > 1 ]]&& echo 1 || echo 0
1
[[ 2 > 11 ]]&& echo 1 || echo 0
1
[[ 2 > 31 ]]&& echo 1 || echo 0
0
4.逻辑连接符
-a相当于&&:与,两端都为真才为真;
-o相当于||:或,两端都为假才为假; !:非.
注意: []中用-a、-o、!,test用法和[]相同; [[]]中用&&、||、!;
在单中括号[]中只能用-a、-o、!,不能用&&,&&只能在双中括号[[]]或两条命令之间使用:
[[ -f "$f1" && -f "$f2" ]] 或 [ -f "$f1" ] && [ -f "$f2" ]
5.分支与循环结构
a.单分支结构
if [条件];then
指令集
fi
相当于条件表达式的:[ -f "$f1" ] && echo 1
b.双分支结构
if [条件];then
指令集1
else
指令集2
fi
相当于条件表达式的:[ -f "$f1" ] && echo 1 || echo 0
c.三分支结构
if 条件1;then
指令集1
elif 条件1;then
指令集2
else
指令集3
fi
6.监控mysql时注意事项:
a.监控nginx、mysql时,脚本名不要写成check_nginx.sh或check_mysql.sh,这样的写法,会让脚本也被当成一个进程,影响判断;
b.[ "`netstat -lnp | grep 3306|awk -F "[ :]+" '{print $5}'`" -eq 3306 ],在进程不存在时这样判断会报错,因为你拿一个空字符串和数字去比较(太啰嗦,一般不用),正确的写法:[ "`netstat -lnp | grep 3306|awk -F "[ :]+" '{print $5}'`" = '3306' ]
c.其他几种写法:
[ `ps -ef|grep -v grep|grep mysqld|wc -l` -gt 0 ]
[ `netstat -lntup|grep mysqld|wc -l` -gt 0 ]
[ `lsof -i :3306|wc -l` -gt 0 ]
# 监控远程主机端口的存活状态
[ `nc -w 2 10.0.0.7 3306 &>/dev/null && echo 1 | wc -l` -gt 0 ]
[ `nmap 10.0.0.7 -p 3306 2>/dev/null|grep open|wc -l` -gt 0 ] [ "`curl -I http://10.0.0.25 2>/dev/null|head -1|egrep '200|301|302'|wc -l`" = "1" ]
[ "`curl -s dev.qingfeng.com:801/svn/ &>/dev/null && echo $?`" = "0"]
7.shell特殊变量
$0:当前脚本的文件名;
$n:传递给脚本或函数的参数.n是一个数字,表示第几个参数.例如:第一个参数是$1,第二个参数是$2;
$#:传递给脚本或函数的参数个数;
$*:传递给脚本或函数的所有参数;
$?:上个命令的退出状态,或函数的返回值;
$$:当前Shell进程ID.对于 Shell 脚本,就是这些脚本所在的进程ID.
8.取变量或字符串的长度:
a.echo "$1" | wc -L
b.echo ${#1}
c.expr length "$1"
9.整数运算的方法:
a.$[]:num=$[ $1 + $2 ]
b.(()):num=$(($1+$2))
c.expr:运算符号两边必须加空格,不加空格会原样输出:
命令行:expr 1 + 2
expr $1 + $2
num=`expr $1 + $2`
d.let:let num=$1 + $2
bc:可以计算浮点数,效率较低的一种,服务器可能没有安装
i=2
i=`echo $i+3|bc`
echo 3.5+6.3 | bc
echo "scale=2;6.5*5.3"|bc # scale保留几位小数
echo "10.2 3.3" | awk '{print ($1-$2)}'
# 计算从1加到10,并列出整个式子
echo `seq -s "+" "10"`=`seq -s "+" "10"|bc`
echo `seq -s "+" "10"`=`seq -s "+" "10"|xargs expr`
1+2+3+4+5+6+7+8+9+10=55
# 整型变量自增 加1的几种方法
a=1 a=$(($a+1)) a=$[$a+1] a=`expr $a + 1` let a++ ((a++))
10.函数后接的参数说明
a.shell的位置参数($1、$2、$#、$*、$?)都可以是函数的参数;
b.$0比较特殊,仍然是父脚本的名称;
c.在函数中return功能跟exit类似,作用是跳出函数;
d.在函数中使用exit会退出整个shell脚本,而不是退出函数;
e.return会返回一个退出值给调用函数的程序;
11.for循环
# C语言型的for循环
for((i=1;i<=5;i++))
do
echo $i
done
for i in {1..5}
for i in `seq 5`
# 5到1的倒序,tac也可以实现倒序
seq 5 -1 1
seq 10 > a.log
# 想要四个一行排列,下列方法哪一种更专业,当然是第二种
cat a.log | xargs -n4
xargs -n4 < a.log
12.break continue exit return对比
break:n表示跳出循环的层数,省略n表示跳出整个循环;
continue:忽略本次循环,进入下一次循环;
exit n:退出当前shell程序,n为返回值;
return n:用于函数中,n是函数的返回值,用于判断函数执行是否正确.
13.数组
数组就是各种数据类型的元素按一定顺序排列的集合.
# 计算数组的长度
arry=(1 2 3)
echo ${#arry[*]}
echo ${#arry[@]}
# shell数组的下标从零开始
echo ${arry[0]} # 查看第一个元素
echo ${arry[*]} # 查看所有元素
# 增加元素或删除元素,截取和替换(略)
arry[3]=4
unset arry[0]
# 动态数组,将命令执行结果放到数组中
cc=(`ls`)
cc=($(ls))
14.shell脚本调试总结
a.首先对dos2unix对脚本格式化;
b.直接执行脚本根据报错来调试;
c.sh -x调试脚本,显示执行过程(范围较大);
d.set -x和set +x调试部分脚本;
e.echo输出变量及相关内容,紧跟着exit退出:exit $var;exit
f.最关键的还是语法熟练、编码习惯、编程思想,将错误扼杀在萌芽,提高效率.
15.linux信号机制(常用1、2、3、15、20)
可以用kill -l或trap -l列出所有信号,常用信号说明
HUP(1):挂起,通常因终端掉线或用户退出(logout)而引发;
INT(2):中断,通常因按下Ctrl+C组合键而引发;
QUIT(3):退出,通常因按下Ctrl+/组合键而引发;
ABRT(6):中止,通常因某些严重的执行错误(程序bug或命令执行出错)而引发;
ALRM(14):报警,通常来处理超时;
TERM(15):终止,通常在系统关机时发送;
TSTP(20):停止进程的运行,但该信号可以被处理和忽略.
用户键入SUSP字符时(通常是Ctrl+Z)发出这个信号.
stty -a # 列出键盘组合键对应的信号
trap -p # 把当前的trap设置打印出来
trap "" signals # 让某个信号失效
trap "commands" signals # 收到signals指定的信号时,信号功能复位同时执行commands命令
trap "ls" 2 # 每次执行Ctrl+C都会跟着执行ls命令
trap signals # 没有命令,只跟了个信号时,信号复原 trap "" 1 2 3 15 20 # 等价用于trap "" HUP INT QUIT TERM TSTP
trap ":" HUP INT QUIT TERM TSTP
冒号:没什么影响,这个内置命令也什么都不做,可以作为Exit Status:Always succeeds
CentOS版本的发行注记
https://wiki.centos.org/zh/Manuals/ReleaseNotes/
https://blog.csdn.net/zhangmingcai/article/details/85341063
shell细节决定高度的更多相关文章
- Shader中贴图知识汇总: 漫反射贴图、凹凸贴图、高光贴图、 AO贴图、环境贴图、 光照纹理及细节贴图
原文过于冗余,精读后做了部分简化与测试实践,原文地址:http://www.j2megame.com/html/xwzx/ty/2571.html http://www.cnblogs.com/z ...
- 常用的GNOME Shell 扩展
GNOME Shell(即GNOME 3)桌面环境最初进军Linux世界时,众多批评人士指出其灵活性有所欠缺.当初外观有所突破的GNOME确实会给生产效率带来一些影响,然而它多年来一直默默通过多种方式 ...
- 面向对象的OOA、OOD、OOP
OOA Object-Oriented Analysis:面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题.OOA与结构化分析有较大的区别.OOA所强调的 ...
- OOA/OOD/OOP(了解)
Object-Oriented Analysis:面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题.OOA与结构化分析有较大的区别.OOA所强调的是在系统 ...
- iOS -Swift 3.0 -UILabel属性大全
昨天研究了一下苹果近两年新出的Swift语言,感觉学起来并不是很吃力,毕竟自己有过Objective-C的语言功底,所以各方面的属性控件还是一眼就可以认出的,只是Swift的写法与Objective- ...
- OOA、OOD、OOP
复习 OOA.OOD.OOP OOA Object-Oriented Analysis:面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题.OOA与结构 ...
- 复习面向对象的OOA、OOD、OOP
复习 OOA.OOD.OOP OOA Object-Oriented Analysis:面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后,依照面向对象的思想来分析问题. OOA与结构化 ...
- OOA/OOD/OOP(转)
OOA Object-Oriented Analysis:面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题.OOA与结构化分析有较大的区别.OOA所强调的 ...
- Python 文本处理的应用
最近根据公司运营部需求要对mongo数据库中的相关信息进行统计,本人一般喜欢将数据库服务器中相关的数据导出来(PS:其一由于Mongo为Nosql,在涉及关联表时不好处理,其二是因为虽然为测试环境,但 ...
随机推荐
- OpenCV中图像的BGR格式及Img对象的属性说明
1. 图像的BGR格式说明 OpenCV中图像读入的数据格式是numpy的ndarray数据格式.是BGR格式,取值范围是[0,255]. 如下图所示,分为三个维度: 第一维度:Height 高度,对 ...
- SQL_2_查询Select语句的使用
查询一词在SQL中并不是很恰当,在SQL中查询除了向数据库提出问题之外,还可以实现下面的功能: 1>建立或删除一个表 2>插入.修改.或删除一个行或列 3>用一个特定的命令从几个表中 ...
- dll和lib关系及使用
对于dll和lib两者的关系,需要理解的一个概念是编译时和运行时. lib是编译时的东西,在lib里面包含了方法名和方法所在的dll名字,可以用dumpbin -all XXX.lib查看内容. ...
- POJ-3278 广度优先搜索入门
#include<stdio.h> #include<stdlib.h> struct node{ int x; int s; }s[]; int main(){ ]={}; ...
- stl vector 类
目录 [-]说明构造方法例子vector 类中定义了4中种构造函数: · 默认构造函数,构造一个初始长度为0的空向量,如:vector<int> v1; · 带有单个整形参数的构造函数,此 ...
- python学习--Django mvc框架简介
让我们一览 Django 全貌 urls.py 网址入口,关联到对应的views.py中的一个函数(或者generic类),访问网址就对应一个函数. views.py 处理用户发出的请求,从urls. ...
- 设计模式之单例模式 Singleton
核心作用 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点. 常见应用场景 优点 由于单例模式只生成一个实例,减少了系统性开销,当一个对象的产生需要比较多的资源时,如读取配置,产生其他依赖对 ...
- TOJ4505: KOSARE
TOJ4505: KOSARE Time Limit(Common/Java):10000MS/30000MS Memory Limit:65536KByteTotal Submit: 11 ...
- 剪枝的定义&&hdu1010
半年前在POJ上遇到过一次剪枝的题目,那时觉得剪枝好神秘...今天在网上查了半天资料,终于还是摸索到了一点知识,但是相关资料并不多,在我看来,剪枝是技巧,而不是方法,也就是说,可能一点实用的小技巧,让 ...
- struts拦截器的使用
拦截器的使用 转自http://blog.csdn.net/woshisap/article/details/7271854 1:拦截器(Interceptor) 拦截器是Struts2最强大的特性之 ...