目录
判断:
shell条件测试
数值比较
文件测试
字符串比较
and和or
流程控制if:
单分支结构:
双分支结构
多分支结构
嵌套结构
调试脚本
注意:
测试语法:
模式匹配:case
判断:
任何编程语言离不开判断(流控)
shell条件测试
数值比较
[ -gt ] 大于
[ -lt ] 小于
[ -eq ] 等于
[ -ne ] 不等于
[ -ge ] 大于等于
[ -le ] 小于等于
文件测试
-f filename :当filename存在时返回真
-b filename :当filename存在并且是块文件时返回真
-d pathname :当pathname存在并且是一个目录时返回真
-h filename :当filename存在并且是符号链接文件时返回真
-c filename :当filename存在并且是字符文件时返回真
-e pathname :当由pathname指定的文件或目录存在时返回真
-g pathname :当由pathname指定的文件或目录存在并且设置了SGID位时返回真 (SGID一种特殊的权限)
-k pathname :当由pathname指定的文件或目录存在并且设置了"粘滞"位时返回真
-p filename :当filename存在并且是命名管道时返回真
-r pathname :当由pathname指定的文件或目录存在并且可读时返回真
-s filename :当filename存在并且文件大小大于0时返回真
-S filename :当filename存在并且是socket时返回真
-t fd :当fd是与终端设备相关联的文件描述符时返回真
-w pathname :当由pathname指定的文件或目录存在并且可写时返回真
-x pathname :当由pathname指定的文件或目录存在并且可执行时时返回真
-O pathname :当由pathname存在并且被当前进程的有效用户id的用户拥有时返回真
-G pathname :当由pathname存在并且属于当前进程的有效用户id的用户的用户组时返回真
字符串比较
比较字符串的时候字符串建议加上双引号
=:等于
!=:不等于
-z:判断字符长度是为0
-n:判断字符长度不是为0
and和or
当条件测试比较复杂时,需要多个条件同时成立,就需要混合条件测试
逻辑的(and)与(or)&&逻辑的and的意思,-a,两个条件同时完成时成立,为真
||逻辑的or的意思,-o,两个条件一个成立,为真表示方法:
[ 条件一 -a 条件二 ]
[[ 条件二 && 条件一 ]]
[ 条件一] && [条件二 ][ 条件一 -o 条件二 ]
[[ 条件二 || 条件一 ]]
[ 条件一] || [条件二 ]
流程控制if:
单分支结构:
if [ 条件 ] ; then符合该条件执行的语句
fi
双分支结构
表示方法一:
if [ 条件 ] then符合该条件执行的语句else不符合该条件执行的语句fi表示方法二:
if 命令then命令返回结果为真else命令返回结果为假
fi
多分支结构
if [ 条件1 ] then符合该条件执行的语句elif [ 条件2 ]then 符合该条件执行的语句elif [ 条件3 ]then 符合该条件执行的语句else不符合该条件执行的语句
fi
嵌套结构
if[条件测试1] then命令序列if[条件测试2]then命令序列else命令序列fi else命令序列
fi
调试脚本
sh -n 文件名 //仅调试脚本中的语法错误
sh -x 文件名 //逐句语句追踪
sh -v 文件名 //显示执行过程详细信息
sh -vx 文件名 //以调试的方式执行,查询整个执行过程,第一行是计算机看到的第二行是计算机执行的第三行是计算机输出的
注意:
1.[]表示条件测试,这里的空格很重要
2.在shell中,then和fi是分开的语句,如果要放在一行,需要分号隔开
3.注意if判断中对变量的处理,需要加引号
4.判断不支持浮点值
5.如果单独使用<或者>系统会认为是重定向,如果要使用,要对这些符号转意
6.默认运行if语句中的命令,所产生的错误信息,会出现在脚本的输出结果中,一般会使用&>/dev/null
7.使用-n或者-z来检查长度时候,没有定义的变量也为0
8.空变量和没有初始化的变量会对shell脚本造成灾难性的影响,再不确定变量内容时,可以使用-n或者-z测试一下
9.$?变量包含了之前执行命令的退出状态,最近完成的前台进程
测试语法:
test 条件表达式
[ 条件表达式 ]
[[ 条件表达式 ]]
模式匹配:case
shell编程中if和case都是用来做流控的
case格式
case 变量 in
模式1)命令序列1
;;模式2)命令序列2
;;模式3)命令序列3
;;*)无匹配命令序列后
;;
esac