如果是Linux shell脚本的条件判断

电脑杂谈  发布时间:2020-03-24 18:27:02  来源:网络整理

shell if语句_linux shell if_linux shell if语句

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.

linux shell if语句_shell if语句_linux shell if

[-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是否存在,如果不存在,请创建一个新目录

linux shell if_linux shell if语句_shell if语句

如果[! -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: 检测执行脚本的用户

shell if语句_linux shell if_linux shell if语句

如果[[$(哇声)”! ='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`

shell if语句_linux shell if语句_linux shell if

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

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...