知方号

知方号

shell脚本 if的使用和判断条件<脚本语言怎么写>

目录

IF使用基础

单分支语句结构

双分支语句结构

 多分支语句结构

条件表达式

文件表达式

数字表达式

字符串表达式

&&  ||使用

test与[  ]

[  ]  与[[  ]]

IF使用基础 单分支语句结构 if [ 条件表达式 ]; then 指令fi 双分支语句结构 if [ 条件表达式 ]; then 指令一else 指令二fi  多分支语句结构 if [ -f file ]; then echo "yes yes yes"elif [ -z file ]; then echo "yes yes"else echo "nonono"fi

注意 if的结构为 if then  else  fi

从上面三个结构中可以看出,条件表达式的左右,以及[ ]的左右都要有空格。

条件表达式 文件表达式

文件属性

-a file

如果file存在则为真

-b file

如果file存在且为块文件则为真

-c file

如果file存在且为字符文件则为真

-d file

如果file存在且是目录则为真

-e file

如果file存在则为真

-f file

如果file存在且为普通文件则为真

-g file

如果file存在且置位设置-组ID则为真,见参考【1】第4.4、12.3节

-h file

如果file存在且为符号连接则为真

-k file

如果file存在且其粘性位置位则为真,参考man chmod

-p file

如果file存在且为命令管道(FIFO)则为真

-r file

如果file存在且可读则为真

-s file

如果file存在且文件长度大于0则为真

-t fd

如果文件描述符fd打开且指向为终端则为真

-u file

如果file存在且设置-用户-ID置位则为真,见参考【1】第4.4节

-w file

如果file存在且可写则为真

-x file

如果file存在且可执行

-G file

如果file存在且由有效组ID拥有则为真,见参考【1】第4.4节

-L file

如果file存在且为符号连接则为真

-N file

如果file存在且在上次读后有修改(modified)则为真

-O file

如果file存在且由有效用户ID拥有则为真,见参考【1】第4.4节

-S file

如果file存在且是一个套接字则为真

file1 -ef file2

如果file1和file2指向同一个设备的inode则为真

file1 -nt file2

如果file1比file新(modified),或者file1存在file2不存在在为真

file1 -ot file2

如果file1比file旧(modified),或者file1存在file2不存在在为真

-r file用户可读为真 -w file用户可写为真 -x file用户可执行为真 -f file文件为正规文件为真 -d file文件为目录为真 -c file文件为字符特殊文件为真 -b file文件为块特殊文件为真 -s file文件大小非0时为真 -t file当文件描述符(默认为1)指定的设备为终端时为真 数字表达式 int1 -eq int2两数相等为真 int1 -ne int2两数不等为真 int1 -gt int2int1大于int2为真 int1 -ge int2int1大于等于int2为真 int1 -lt int2int1小于int2为真 int1 -le int2int1小于等于int2为真

不要用=符号,如果要用的话

整数比较-eq 等于,如:if [ "$a" -eq "$b" ]-ne 不等于,如:if [ "$a" -ne "$b" ]-gt 大于,如:if [ "$a" -gt "$b" ]-ge 大于等于,如:if [ "$a" -ge "$b" ]-lt 小于,如:if [ "$a" -lt "$b" ]-le 小于等于,如:if [ "$a" -le "$b" ]< 小于(需要双括号),如:(("$a" < "$b")) "$b"))>= 大于等于(需要双括号),如:(("$a" >= "$b")) 字符串表达式

字符串测试

-z string

如果string长度为0则为真

string

-n string

如果string长度不为0则为真

string1 == string2

string1 = string2

如果string1和string2相等则为真,=只应由test使用

string1 != string2

如果字符串不相等则为真

string1 < string2

如果按字典序string1在string2之前则为真

string1 > string2

如果按字典序string1在string2之后则为真

str1 = str2当两个串有相同内容、长度时为真 str1 != str2 当串str1和str2不等时为真 -n str1 当串的长度大于0时为真(串非空) -z str1 当串的长度为0时为真(空串) str1 当串str1为非空时为真 &&  ||使用

在[  ]中不能用&&  ||

要用

-a 与 -o 或 !非

if [ $score -ge 0 -a $score -lt 60 ];then echo "sorry,you are lost!" elif [ $score -ge 60 -a $score -lt 85 ];then echo "just soso!" elif [ $score -le 100 -a $score -ge 85 ];then echo "good job!" else echo "input score is wrong , the range is [0-100]!" fi

如果一定要用&& ||则要到[[  ]]中使用,

test与[  ]

格式1:test 格式2:[]

格式1和格式2是等价的。

test 一般在linux界面用,[   ]一般在if表达式用

1、测试文件是否存在[root@node01 ~]# test -f file&& echo 1||echo 00[root@node01 ~]# touch file[root@node01 ~]# test -f file&& echo 1||echo 01[root@node01 ~]# test ! -f file&& echo 1||echo 0 取反0 2、中括号[root@node01 ~]# [ -f file ]&& echo 1||echo 01[root@node01 ~]# rm file[root@node01 ~]# [ -f file ]&& echo 1||echo 00[root@node01 ~]# [ ! -f file ]&& echo 1||echo 0 1 [  ]  与[[  ]]

[[ ]],这是内置在shell中的一个命令,它就比刚才说的[ ]强大的多了。支持字符串的模式匹配(使用=~操作符时甚至支持shell的正则表达 式)。简直强大的令人发指!逻辑组合可以不使用test的-a,-o而使用&&,||这样更亲切的形式(针对c、Java程序员)。

1. 首先,尽管很相似,但是从概念上讲,二者是不同层次的东西。 "[[",是关键字,许多shell(如ash bsh)并不支持这种方式。ksh, bash(据说从2.02起引入对[[的支持)等支持。 "["是一条命令, 与test等价,大多数shell都支持。在现代的大多数sh实现中,"["与"test"是内部(builtin)命令,换句话说执行"test"/"["时不会调用/some/path/to/test这样的外部命令(如果有这样的命令的话)。 2.[[]]结构比Bash版本的[]更通用。在[[和]]之间的所有的字符都不会被文件扩展或是标记分割,但是会有参数引用和命令替换。

用[[ ... ]]结构比用[ ... ]更能防止脚本里的许多逻辑错误。比如说,&&,||,操作符能在一个[[]]测试里通过,但在[]结构会发生错误。

3.[ ... ]为shell命令,所以在其中的表达式应是它的命令行参数,所以串比较操作符">" 与"

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。