【重点】Shell入门教程:流程控制(2)条件判断的写法

第三节:条件判断的写法

if条件判断中,if的语法结构中的“条件判断”可以有多种形式。测试结果是真是假,就看其传回的值是否为0。

条件测试的写法,有以下10种:

1.执行某个命令的结果

这里的命令,可包括管道命令,例如:命令1 | 命令2 | 命令3,称为 pipeline,其结束状态为最后一个命令执行的结果。

举例:

#!/bin/bash

if grep -q "rm" fn.sh; then
	echo "find in command."
else
	echo "not find."
fi

行3,在条件测试中,执行命令时:grep -q "rm" fn.sh,它是寻找fn.sh文件里是否有关键词rm。选项-q表示不显示,仅借助$?来传回执行结果。

2.传回某个命令执行结果的相反值

其形式为: ! 命令

注意,! 和 命令之间要有“空格符”隔开。

如果命令传回值为0,则加上 ! 之后传回值为1;反之,如果命令传回值为非0,则加上 ! 后,传回值为0。

举例:

#!/bin/bash

if ! grep -q "rm" fn.sh; then
	echo "not find."
else
	echo "find rm command"
fi

3.使用复合命令:((算术))

如果算式的运算结果不为0,则传回真值(0),否则如果运算结果为0,则传回假值(1)。再举例如下:

((算式)) 运算结果 判断真假值
((0)) 0
((1)) 1
((8)) 8
((-1)) -1
((2-2)) 0
((5*6)) 30
((20<30)) 数字比较运算为真
((20&&30)) 逻辑AND运算为真
((20&&0)) 逻辑AND运算为假
((0&&1)) 逻辑AND运算为假
((10||0)) 逻辑OR运算为真
((0||1)) 逻辑OR运算为真
((0||0)) 逻辑OR运算为假

4.使用Bash关键字‘[[’、‘]]’组成的式子:[[ 判断式 ]]

判读式会传回真假值,传回0为真,非0为假。

注意:[[ 的后面、]] 的前面,至少要有一个(含)以上的“空格符”才行。

举例:

#!/bin/bash

if [[ str > xyz ]]; then
	echo "字符串str比较大"
else
	echo "字符串str比较小"
fi

执行结果:显示“字符串str比较小”

5.使用内置命令:test 判断式

test是Bash的内置命令,可传回“判断式”的结果,真值传回0,假值传回1。

举例:

#!/bin/bash

if test "str" \> "xyz"; then
	echo "字符串str比较大"
else
	echo "字符串str比较小"
fi

执行结果:显示“字符串str比较小”

要特别注意的是:大于符号 > 对Bash而言是特殊字符,要用 \ 予以转义,不然,无法得到正确的测试结果。

6.使用内置命令:[ ]

格式为:[ 判断式 ]

[] 和 test 的用法是相同的,两者可改写互换。

举例:

#!/bin/bash

if [ "str" \> "xyz" ]; then
	echo "字符串str比较大"
else
	echo "字符串str比较小"
fi

执行结果:显示“字符串str比较小”

要特别注意的是:大于符号 > 对Bash而言是特殊字符,一样要用 \ 予以转义。

此例的第1行,可改写成test的用法

if test "str" \> "xyz"; then

7.使用 -a、-o 进行逻辑组合:

注意: -a、-o 是放在 [ ] 里面的!

举例:

[ -r filename1 -a -x filename1]

如果 filename1 可读且可执行,则为真。-o 即 “且”之意。

[ -r filename1 -o -x filename1]

如果filename1可读或可执行,则为真。-o即“或”之意。

8.命令1 && 命令2

&& 称为逻辑的AND,其运作方式是:如果“命令1”执行结果为真,才会执行“命令2”;如果两个皆为真,则传回真值0,否则传回假值1。

#!/bin/bash

a=20
if grep -q "rm" fn.sh && [ $a -lt 100 ]; then
	echo "ok"
else
	echo "not ok"
fi

&& 的特性,经常拿来当做是一种隐形的if语法。例如:

[ -z "$PS1" ] && return

代码意思是:先判断 $PS 变量值是否为空,如果是,就执行return命令,由子Shell环境返回到父Shell,这等于是结束执行该Script。等同于以下if语句:

if [ -z "$PS1" ]; then
	return;
fi

再来看一例:

[ -f /proc/net/if_inet6 ] && echo ‘这部主机支持IPv6‘

往后,凡是“[ 判断式 ] && 指令”的形式,就视为一种隐形的 if-then 语法。

9.命令1 || 命令2

|| 称为逻辑的OR,其运作方式是:如果“命令1”执行结果为假,才会执行“命令2”;如果两个之中有一个为真,则传回真值0,否则传回假值1。

#!/bin/bash

a=200
if grep -q "rm" fn.sh || [ $a -lt 100 ]; then
	echo "ok"
else
	echo "not ok"
fi

|| 的特性,也可当做是一种隐形的if语法。例如:

prefix="/home"
defpath="/usr/local/bin"
[ -z ${prefix:-} ] || prefix=${defpath%/*}

行3,因 $prefix非空,所以,${prefix:-} 变量扩展的传回值为prefix的变量值(非空),[ -z ${prefix:-} ] 对空值的条件测试失败,其结果为假,根据 || 的特性,会接着执行 prefix=${defpath%/*},它会由 $defpath 后方删去样式 /* 的最短字符串,即删去 /bin,因此,$prefix的值为 /usr/local。

本例可改写成if语法如下:

prefix="home"
defpath="/usr/local/bin"
if [ ! -z ${prefix:-} ]; then
	prefix=${defpath%/*}
fi

10.&& 和 || 合用

&& 和 || 合用,也可以有 if-then-else 的效果,例如:

[ -n ${DEBUG:-} ] && set -v || set +v

这行代码,使用 -n 测试变量DEBUG是否有设非空值,如果有,表示要进行排错,接着执行AND的下一个指令:set -v;如果无,则不进行排错,而执行逻辑OR的下一个指令:set -v,它会把显示程序的功能关闭。

本例可改写if语法如下:

if [ -n "$DEBUG" ]; then
	set -v
else
	set +v
fi

往后,凡是“[ 判断式 ] && 指令1 || 指令2”的形式,就视为一种隐形的 if-then-else 的语法。

最后总结:

在上述这些条件测试的方法中,[[]] 和 test、[] 的意思和用法是相近的,但 [[]] 比 test 和 [] 更自由一点,因为 [[]] 不必担心某些Bash特殊字符对运算符的影响,不必写一堆转义字符的怪字符,如 [[ str < xyz ]] 是正确的语法,但在 [] 中却要写成 [ str \< xyz ],这种陷阱很容易忘记,一旦忘了写转义字符,要发现错误所在,就不容易了。在 [[]] 中,<、>、&&、、|| 等都可以自由地使用,不必使用转义字符。

除了[[]]之外,在Bash中,(())也不必理会上述提到的特殊字符的影响。

下面,还有一点要特别注意的:

在 [[ 判断式 ]] 中,如果使用 == 或 != ,且在这两个运算符右方的字符串没有加上单引号或双引号,则 == 和 != 会视为想要对比该字符串所形成的“样式”,如果相等,传回0,如果不符,传回1。

举例:

#!/bin/bash

a="str"
if [[ $a == ??? ]]; then
	echo "Match"
fi

行4,[[ $a == ??? ]] 的意思是说,用 $a 的值,对比样式 ??? (3个字符的字符串)。

但如果把行4改成:

if [[ $a == "???" ]]; then

那意思就不同了,此时 == 变成了是判断 $a 和 字符串 ??? 是否相等。

时间: 2024-11-04 21:44:10

【重点】Shell入门教程:流程控制(2)条件判断的写法的相关文章

廖雪峰Java1-3流程控制-3条件判断

1.if条件判断的格式 if (条件) { 代码块 } if (条件) { 代码块1 } else { 代码块2 } if (条件1) { 代码块1 } else if { 代码块2 } else { 代码块3 } 2.整型判断 条件判断注意的事项: 注意判断顺序 注意边界条件 int n = 100; if (n >= 90){ System.out.println("优秀"); }else if(n >= 60){ System.out.println("及格

Python流程控制-2 条件判断

条件判断 条件判断是通过一条或多条判断语句的执行结果(True或者False)来决定执行的代码块. 在Python语法中,使用if.elif和else三个关键字来进行条件判断. if语句的一般形式如下所示 if condition1: # condition1为True 执行statement_block_1 statement_block_1 elif condition2: # condition2为True 执行statement_block_2 statement_block_2 els

shell编程 之 流程控制(条件语句和循环语句)

1 if ...else... 基本格式: if condition then commend else commend fi 当然也可以写到一行,用[ ]表明边界,用:表示分行.比如: if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi    判断条件用方括号括起来表示分界,意思是统计当下进程中 带'ssh'的字符串数量,如果这个数量大于1,那就输出true,结束. 还有带elif的格式,如下:

Shell入门教程:流程控制(1)命令的结束状态

在Bash Shell中,流程控制命令有2大类:“条件”.“循环”.属于“条件”的有:if.case:属于“循环”的有:for.while.until:命令 select 既属于“条件”,也属于“循环”.不管是哪一种,均需进行条件测试,再根据测试结果,决定程序流程进行的方向. 以下逐一说明这些命令的用法. 第一节:命令的结束状态 Bash Shell Script 可由许多命令组成.每一个命令执行后,都会传回一个结束状态值,如果执行成功,传回0,如果执行失败,则传回非0值.执行失败,也分成许多状

Linux shell 流程控制(条件if,循环for,while)

Linux shell 流程控制(条件if,循环[for,while],选择[case]语句实例 linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case).下面我将通过例子介绍下,各个语句使用方法. 一.shell条件语句(if用法) if语句结构[if/then/elif/else/fi] if 条件测试语句 then action [elif 条件 action else action ] fi 如果对于:条件测试语句不是

python入门之类型、条件、运算符、流程控制之if判断

1:可变.不可变类型 可变类型:值改变,id不变,原值可以被修改 可变类型包括:list,dict l = [111,222,333] print(id(l)) l[0] = 444 print(l) print(id(l)) # l中的第一个内容被修改,但两个结果id是相同的 dic = {'k1':111,'k2':222} print(id(dic)) dic['k1'] = 3333333333 print(dic) print(id(dic)) # dic中的'k1'被修改,但是两个结

shell脚本之流程控制

shell脚本之流程控制 shell脚本之流程控制 条件语句 条件判断 循环语句for,while,until for循环 while循环 until循环 循环控制语句continue 循环控制语句break 循环控制shift命令 创建无限循环 while的特殊用法 for的特殊用法 select循环与菜单 select与case 信号捕捉trap 条件语句 选择执行: 注意:if语句可嵌套 单分支 if 判断条件;then 条件为真的分支代码 fi 双分支 if 判断条件; then 条件为

shell脚本编程——流程控制

shell脚本编程--流程控制 目   录 一. if 二. case 三. for 四. while 五. until 六. 综合应用 一.if 1.语法 (1)单分支 if  判断条件:then fi (2)双分支 if 判断条件; then 条件为真的分支代码 else 条件为假的分支代码 fi (3)多分支 if 判断条件1; then 条件为真的分支代码 elif 判断条件2; then 条件为真的分支代码 elif 判断条件3; then 条件为真的分支代码 else 以上条件都为假

Shell命令和流程控制

Shell命令和流程控制 在shell脚本中可以使用三类命令: 1)Unix 命令: 虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令.这些命令通常是用来进行文件和文字操作的. 常用命令语法及功能 echo "some text": 将文字内容打印在屏幕上 ls: 文件列表 wc –l filewc -w filewc -c file: 计算文件行数 计算文件中的单词数 计算文件中的字符数 cp sourcefile destfile: 文件拷贝 mv