
2. 扩展语法:
if [command];然后
根据此条件执行的声明
elif [command];然后
根据此条件执行的声明
其他
根据此条件执行的声明
fi
3. 语法说明:
bash shell将按顺序执行if语句. 如果命令已执行且返回状态为0,则将执行满足此条件的语句,否则后续命令将不执行,并跳至下一个命令.
当有多个嵌套时,只有第一个返回退出状态为0的命令将导致执行满足此条件的语句部分. 如果所有语句的执行状态都不为0,则执行else中的语句.
返回状态: 最后一条命令的退出状态;如果没有条件为真,则返回0.
注意:
1,[]表示条件测试. 请务必注意此处的空格. 请注意,'['之后和']'之前必须有一个空格
2. 在shell中,then和fi是单独的语句. 如果要在同一行上输入它们,则需要用分号分隔它们.
3. 在判断变量时要注意变量的处理,您需要添加引号以避免某些不必要的错误. 判断某些字符串变量(包括空格)时,未能添加双引号会导致错误. 例如[-n'$ var']如果var为空,将发生错误
4. 判断是否不支持浮点值
5. 如果仅使用>或<符号,则系统会将其视为输出或输入重定向. 尽管结果是正确的,但实际上是错误的.
6. 默认情况下,在if语句中运行命令所生成的错误消息仍会出现在脚本的输出中.
7. 使用-z或-n检查长度时,未定义的变量也为0
8. 空变量和未初始化的变量可能会对Shell脚本测试产生灾难性的影响,因此,如果不确定变量的内容,请在测试编号之前使用-n或-z对其进行测试.
9,那个?变量包含先前执行的命令(最近完成的前台进程)的退出状态(可用于检测退出状态)
常用参数:
文件/目录判断:
[-a FILE]如果FILE存在,则为true.
[-b FILE]如果FILE存在并且是一个阻止文件,则返回true.
[-c FILE]如果FILE存在并且是字符文件,则返回true.
[-d FILE]如果FILE存在并且是目录,则返回true.
[-e FILE]如果指定的文件或目录存在,则返回true.
[-f FILE]如果FILE存在并且是普通文件,则返回true.
[-g FILE]如果FILE存在并且设置了SGID,则返回true.
[-h FILE]如果FILE存在并且是符号符号链接文件,则返回true. (此选项在某些较旧的系统上不起作用)
[-k FILE]如果FILE存在并且已经设置了冒险位,则返回true.
[-p FILE]如果FILE存在并且是命令管道,则返回true.
[-r FILE]如果FILE存在且可读,则返回true.
[-s FILE]如果FILE存在且其大小非零,则返回true.
[-u FILE]如果FILE存在并且SUID位置1,则返回true.
[-w FILE]如果FILE存在且可写,则返回true. (目录必须是可执行文件才能访问其内容)
[-x FILE]如果FILE存在且可执行,则返回true.
[-O FILE]如果FILE存在并且是有效的用户ID,则返回true.

[-G FILE]如果FILE存在且默认组为当前组,则返回true. (仅检查系统默认组)
[-L FILE]如果FILE存在并且是符号链接,则返回true.
[-N FILE]如果FILE存在并且自上次读取以来被修改,则返回true.
[-S FILE]如果FILE存在并且是套接字,则返回true.
[FILE1 -nt FILE2]如果FILE1比FILE2更新linux shell if语句,或者FILE1存在但FILE2不存在,则返回true.
[FILE1 -ot FILE2]如果FILE1早于FILE2,或者如果FILE2存在但FILE1不存在,则返回true.
[FILE1 -ef FILE2]如果FILE1和FILE2指向相同的设备和节点号,则返回true.
字符串判断
[-z STRING]如果STRING的长度为零,即null为true,则返回true
[-n STRING]如果STRING的长度不为零,即非null为真,则返回true
[STRING1]如果字符串不为空,则返回true,类似于-n
[STRING1 == STRING2]如果两个字符串相同,则返回true
[STRING1! = STRING2]如果字符串不同,则返回true
[STRING1 [STRING1> STRING2]如果将“ STRING1”词典排在“ STRING2”之后,则返回true. 数值判断 [INT1 -eq INT2]如果INT1和INT2相等,则返回true,= [INT1 -ne INT2]如果INT1和INT2不相等,则返回true,<> [INT1 -gt INT2] INT1大于INT2并返回true,> [INT1 -ge INT2] INT1大于或等于INT2并返回true,> = [INT1 -lt INT2] INT1小于INT2并返回true,< [INT1 -le INT2] INT1小于或等于INT2并返回true,<= 逻辑判断 [! EXPR]逻辑否定. 如果EXPR为假,则返回true. [EXPR1 -a EXPR2]逻辑与. 如果EXPR1和EXPR2都为true,则返回true. [EXPR1 -o EXPR2]逻辑或. 如果EXPR1或EXPR2为true,则返回true. [] || []用OR组合两个条件 [] && []用AND合并两个条件 其他判决 [-t FD]如果文件描述符FD(默认值为1)打开并指向终端,则返回true [-o optionname]如果打开了shell选项optionname,则返回true IF高级功能: 双括号(()): 表示数学表达式 在比较命令中仅允许简单的算术运算,并且双括号提供了更多的数学符号,并且双括号内的'>','<'符号不需要更改. 双括号[[]]: 表示高级字符串处理功能 两个括号中的判断命令使用标准字符串比较. 您还可以使用匹配模式来定义与字符串匹配的正则表达式. 双括号的作用 在外壳中,[$ a! = 1 || $ b = 2]是不允许的,请使用[$ a! = 1] || [$ b = 2],并且双括号可以解决此问题. [[$ a! = 1 || $ b = 2]]. 另一个示例是此['$ a'-lt'$ b'],也可以将其更改为双括号(('$ a'<'$ b')) 示例 1: 确定目录$ doiido是否存在,如果不存在,请创建一个新目录 如果[! -d'$ doiido'];然后 mkdir'$ doiido' fi 2: 确定公用文件$ doiido是否存在linux shell if语句,如果不存在,则创建一个新文件 如果[! -f'$ doiido'];然后 触摸“ $ doiido” fi 3: 确定$ doiido是否存在并具有可执行权限 如果[! -x'$ doiido'];然后 mkdir'$ doiido' chmod x'$ doiido' fi 4: 确定变量$ doiido是否具有值 如果[! -n'$ doiido'];然后 回声'$ doiido为空' 退出0 fi 5: 确定两个变量是否相等 如果['$ var1'='$ var2'];然后 echo'$ var1 eq $ var2' 其他 echo'$ var1 not eq $ var2' fi 6: 测试退出状态: 如果[$? -eq 0];然后 回声“没关系” fi 7: 值比较: 如果['$ num'-gt'150'] echo'$ num大于150' fi 8: a> b和一个 (((a> b))&&((a [[[$ a> $ b]] && [[$ a <$ c]] [$ a -gt $ b -a $ a -lt $ c] 9: a> b或 (((a> b))|| ((a [[[$ a> $ b]] || [[$ a <$ c]] [$ a -gt $ b -o $ a -lt $ c] 10: 检测执行脚本的用户 如果[[$(哇声)”! ='root'];然后 echo'您无权以非root用户身份运行$ 0. ' 退出1; fi 上面的语句也可以使用以下简明的语句 ['$(whoami)'! ='root'] &&(回显“您无权以非root用户身份运行$0. ”;退出1) 11: 正则表达式 doiido ='hero' if [[''$ doiido'== h *]];然后 回声“你好,英雄” fi =============其他示例============= 1. 查看当前的操作系统类型 #! / bin / sh SYSTEM =`uname -s` 如果[$ SYSTEM ='Linux'];然后 回显“ Linux” elif [$ SYSTEM ='FreeBSD'];然后 回显“ FreeBSD” elif [$ SYSTEM ='Solaris'];然后 回显“ Solaris” 其他 回声“什么?” fi 2,如果使用read传递参数进行判断 #! / bin / bash 阅读-p'请输入分数: '分数 echo -e'您的分数[$分数]现在由sys来评估' if ['$ score'-ge'0'] && ['$ score'-lt'60'];然后 回声“对不起,你迷路了!” elif ['$ score'-ge'60'] && ['$ score'-lt'85'];然后 回声“就这样!” elif ['$ score'-le'100'] && ['$ score'-ge'85'];然后 回声“干得好!” 其他 echo'输入分数错误,范围是[0-100]!' fi 3,确定文件是否存在 #! / bin / sh 今天=`日期-d昨天%y%m%d` file ='apache_ $ today.tar.gz' cd / home / chenshuo / shell 如果[-f'$ file'];然后 回声“确定” 其他 echo'error $ file'> error.log mail -s'测试失败备份'loveyasxn924@126.com fi 4. 该脚本由cron在每个星期日执行. 如果周数是偶数,他会提醒您清理垃圾桶: #! / bin / bash WEEKOFFSET = $ [$($'%V')%2] 如果[$ WEEKOFFSET -eq'0'];然后 回声: “星期天晚上,拿出垃圾桶. ” 邮件-s'垃圾桶'your@your_domain.org fi 5. 挂载硬盘脚本(Windows下为NTFS格式的硬盘) #! / bin / sh dir_d = /媒体/ disk_d dir_e = /媒体/ disk_e dir_f = /媒体/ disk_f a =`ls $ dir_d | wc -l` b =`ls $ dir_e | wc -l` c =`ls $ dir_f | wc -l` 回显“正在检查disk_d ...” 如果[$ a -eq 0];然后 echo'disk_d不存在,正在创建...' sudo mount -t ntfs / dev /磁盘/按标签/软件/介质/ disk_d 其他 回显“ disk_d出口” fi echo'正在检查disk_e ...' 如果[$ b -eq 0];然后 echo'disk_e不存在,正在创建...' sudo mount -t ntfs / dev / disk / by-label / elitor / media / disk_e 其他 echo'disk_e exits' fi 回显“正在检查disk_f ...” 如果[$ c -eq 0];然后 echo'disk_f不存在,正在创建...' sudo mount -t ntfs / dev / disk / by-label / work / media / disk_f 其他 回显“ disk_f出口” fi


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-150906-1.html
没人希望战争
反舰导弹就很被动