SHELL十三问之十:&& 与 || 差在哪?

本文介绍了Shell环境中命令执行后的返回值(return value)概念及其作用,详细解释了如何通过 $? 获取最近一次命令的返回值,并介绍了 test 命令用于条件判断的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在解答本章题目之前,先让我们了解一个概念:return value !
jDb"id gy$A我们在 shell 下跑的每一个 command 或 function ,在结束的时候都会传回父进程一个值,称为 return value 。
:x9zJX{,I vh在 shell command line 中可用 $? 这个变量得到最"新"的一个 return value ,也就是刚结束的那个进程传回的值。
;c!HL k"ug O,h eReturn Value(RV) 的取值为 0-255 之间,由程序(或 script)的作者自行决定:
;~:i2nPgP0zUqi
* 若在 script 里,用 exit RV 来指定其值,若没指定,在结束时以最后一道命令之 RV 为值。
n/h*Z�UX+j#]C5b* 若在 function 里,则用 return RV 来代替 exit RV 即可。
BSD爱好者乐园(y,P.I%} X+W9}q
BSD爱好者乐园 qUEs9tRM
Return Value 的作用,是用来判断进程的退出状态(exit status),只有两种:
Fq2a]`S8p~
* 0 的话为"真"( true )BSD爱好者乐园+m"U5WH3ZU0GlmD
* 非  0 的话为"假"( false )
BSD爱好者乐园 oZb;u3[3u

#O;qMP7x/aw ZoT举个例子来说明好了:
,E7pV7_ M!?~_5N假设当前目录内有一份 my.file 的文件,而 no.file 是不存在的:
BSD爱好者乐园/p7W2Y/[4tW6T4tl

$ touch my.fileBSD爱好者乐园j6C&_f V? g JJM
$ ls my.file
g%Yg'`@!NoMK$ echo $?        # first echo
t p+/ Lapb%l'Z0BSD爱好者乐园Pivo*?
$ ls no.fileBSD爱好者乐园c.Jw-r#t({X*s8L
ls: no.file: No such file or directoryBSD爱好者乐园S5D#y.d|;m(a(P
$ echo $?        # second echoBSD爱好者乐园.~0_w(@)I
1
?)D c/dZ+i.j N$ echo $?        # third echo
v!c[O"~l3k_`6Z2y0

AX/L3Q%]"wb

上例的第一个echo 是关于 ls my.file 的 RV ,可得到 0 的值,因此为 true ﹔
FJ!KW:^ z第二个 echo 是关于 ls no.file 的 RV ,则得到非 0  的值,因此为 false ﹔
6V7mg:/4{第三个 echo 是关于第二个 echo $? 的 RV ,为 0 的值,因此也为 true 。
|-h(e$`#t4I|W~
z/Z7Bwz(w请记住:每一个 command 在结束时都会送回 return value 的﹗不管你跑甚么样的命令...
]I)w_m然而,有一个命令却是"专门"用来测试某一条件而送出 return value 以供 true 或 false 的判断,
U5bUR D它就是 test 命令了﹗
@ j`6w0af'w8N若你用的是 bash ,请在 command line 下打 man test 或 man bash 来了解这个 test 的用法。
%jb*u r J这是你可用作参考的最精确的文件了,要是听别人说的,仅作参考就好...BSD爱好者乐园]q1Js9i)pIF;Ct)c
下面我只简单作一些辅助说明,其余的一律以 man 为准:BSD爱好者乐园 K4PR�U X8M1Y

ro+Q6hR Yc;`首先,test 的表示式我们称为 expression ,其命令格式有两种:
BSD爱好者乐园"QS2^r-yec

test expression
%kU EJ {.v%G B%kdor:
)Xb1]EG b9F uV)O_[ expression ]
BSD爱好者乐园 KM;K9@I:^sr z

(请务必注意[ ] 之间的空格键)BSD爱好者乐园,K!f4hAdZ
用哪一种格式没所谓,都是一样的效果。(我个人比较喜欢后者...)
j*T$}H%DM1h.LBXlBSD爱好者乐园 VkO9P7v p
其次,bash 的 test 目前支持的测试对像只有三种:
r)d0t)s wR p bK}* string:字符串,也就是纯文字。
V1i%{A;G+b2H&Pl* integer:整数( 0 或正整数,不含负数或小数点)。
/x6sa|(o_* file:文件。
O L'Q#{E:ko请初学者一定要搞清楚这三者的差异,因为 test 所用的 expression 是不一样的。
M/HxB H8U*F(L$A k以 A=123 这个变量为例:
4N ^%e L[1S R* [ "$A" = 123 ]:是字符串的测试,以测试 $A 是否为 1、2、3 这三个连续的"文字"。
MYwZb-A(D6~* [ "$A" -eq 123 ]:是整数的测试,以测试 $A 是否等于"一百二十三"。
Wi)IJ }lK* [ -e "$A" ]:是关于文件的测试,以测试 123 这份"文件"是否存在。
-fL;I�]p2df
j:/ U3D8_T5}q&?~ S第三,当 expression 测试为"真"时,test 就送回 0 (true) 的 return value ,否则送出非 0 (false)。BSD爱好者乐园Rj{wS~B Pi
若在 expression 之前加上一个 " ! "(感叹号),则是当 expression 为"假时" 才送出 0 ,否则送出非 0 。
u(G-v h!D8B3d a/同时,test 也允许多重的覆合测试:
.NtZr.q5R* expression1 -a expression2 :当两个 exrepssion 都为 true ,才送出 0 ,否则送出非 0 。BSD爱好者乐园(FYW5x@-Ne]d
* expression1 -o expression2 :只需其中一个 exrepssion 为 true ,就送出 0 ,只有两者都为 false 才送出非 0 。
j&b1t

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值