shell十三问-10)&& 与 || 差在哪

好不容易,�M入�晌�档恼鹿�了... 一路走�恚�很辛苦吧?也很快�钒桑�  ^_^

在解答本章�}目之前,先�我��了解一��概念:return value �u
我��在 shell 下跑的每一�� command 或 function ,在�Y束的�r候都���骰馗感谐桃��值,�Q�� return value 。
在 shell command line 中可用 $? �@���量得到最"新"的一�� return value ,也就是���Y束的那��行程�骰氐闹怠�
Return Value(RV) 的取值�� 0-255 之�g,由程式(或 script)的作者自行定�h:
* 若在 script �e,用 exit RV �碇付ㄆ渲担�若�]指定,在�Y束�r以最後一道命令之 RV �橹怠�
* 若在 function �e,�t用 return RV �泶�替 exit RV 即可。

Return Value 的作用,是用�砼�嘈谐痰耐顺��B(exit status),只有�煞N:
* 0 的���"真"( true )
* 非  0 的���"假"( false )

�e��例子�碚f明好了:
假�O��前目��扔幸环� my.file 的文件,而 no.file 是不存在的:
 

  1. $ touch my.file
     
  2. $ ls my.file
     
  3. $ echo $?        # first echo
     
  4. 0
     
  5. $ ls no.file
     
  6. ls: no.file: No such file or directory
     
  7. $ echo $?        # second echo
     
  8. 1
     
  9. $ echo $?        # third echo
     
  10. 0
复制代码


上例的第一�� echo 是�P於 ls my.file 的 RV ,可得到 0 的值,因此�� true �r
第二�� echo 是�P於 ls no.file 的 RV ,�t得到非 0  的值,因此�� false �r
第三�� echo 是�P於第二�� echo $? 的 RV ,�� 0 的值,因此也�� true 。

��住:每一�� command 在�Y束�r都��送回 return value 的�u不管你跑甚�N�拥拿�令...
然而,有一��命令�s是"�iT"用��y�某一�l件而送出 return value 以供 true 或 false 的判�啵�
它就是 test 命令了�u
若你用的是 bash ,�在 command line 下打 man test 或 man bash �砹私膺@�� test 的用法。
�@是你可用作�⒖嫉淖罹��_的文件了,要是��e人�f的,�H作�⒖季秃�...
下面我只��巫饕恍┹o助�f明,其�N的一律以 man ��剩�

首先,test 的表示式我���Q�� expression ,其命令格式有�煞N:
 

  1. test expression
     
  2. or:
     
  3. [ expression ]
复制代码


(��毡刈⒁� [ ] 之�g的空白�I�u)
用哪一�N格式�]所�^,都是一�拥男Ч�。(我��人比�^喜�g後者...)

其次,bash 的 test 目前支援的�y��ο裰挥腥��N:
* string:字串,也就是�文字。
* integer:整��( 0 或正整�担�不含��祷蛐�迭c)。
* file:文件。
�初�W者一定要搞清楚�@三者的差��,因�� test 所用的 expression 是不一�拥摹�
以 A=123 �@���量�槔�:
* [ "$A" = 123 ]:是字串的�y�,以�y� $A 是否�� 1、2、3 �@三���B�m的"文字"。
* [ "$A" -eq 123 ]:是整�档�y�,以�y� $A 是否等於"一百二十三"。
* [ -e "$A" ]:是�P於文件的�y�,以�y� 123 �@份"文件"是否存在。

第三,�� expression �y���"真"�r,test 就送回 0 (true) 的 return value ,否�t送出非 0 (false)。
若在 expression 之前加上一�� " ! "(感�@�),�t是�� expression ��"假�r" 才送出 0 ,否�t送出非 0 。
同�r,test 也允�S多重的覆合�y�:
* expression1 -a expression2 :����� exrepssion 都�� true ,才送出 0 ,否�t送出非 0 。
* expression1 -o expression2 :只需其中一�� exrepssion �� true ,就送出 0 ,只有�烧叨�� false 才送出非 0 。
例如:
 

  1. [ -d "$file" -a -x "$file" ]
复制代码


是表示�� $file 是一��目�、且同�r具有 x �嘞�r,test 才���� true 。

第四,在 command line 中使用 test �r,��e忘�命令行的"重�M"特性,
也就是在碰到 meta �r��先�理 meta 再重新�M建命令行。(�@��特性我在第二及第四章都曾反覆���{�^)
比方�f,若 test 碰到�量或命令替�Q�r,若不能�M足 expression 格式�r,���得到�Z法�e�`的�Y果。
�e例�碚f好了:
�P於 [ string1 = string2 ] �@�� test 格式,
在 = ��蛇�必�要有字串,其中包括空(null)字串(可用 soft quote  或 hard quote 取得)。
假如 $A 目前�]有定�x,或被定�h�榭兆执�的�,那如下的��法���失�。�
 

  1. $ unset A
     
  2. $ [ $A = abc ]
     
  3. [: =: unary operator expected
复制代码


�@是因�槊�令行碰到  $ �@�� meta �r,��替�Q $A 的值,然後再重�M命令行,那就�成了:
[ = abc ]
如此一�� = �左�就�]有字串存在了,因此造成 test 的�Z法�e�`�u
但是,下面�@����法�t是成立的:
 

  1. $ [ "$A" = abc ]
     
  2. $ echo $?
     
  3. 1
复制代码


�@是因�樵诿�令行重�M後的�Y果�椋�
[ "" = abc ]
由於 = 左�我��用 soft quote 得到一��空字串,而� test �Z法得以通�^...

�x者�T君��毡亓粢膺@些��哦,因�樯砸徊簧鳎�����е� test 的�Y果�了���萤u
若您�� test �不是很有��的�,那在使用 test �r不妨先�裼萌缦逻@一��"法�t":
* 假如在 test 中碰到�量替�Q,用 soft quote 是最保�U的�u
若你�� quoting 不熟的�,�重新�亓�第四章的�热莅�...  ^_^

okay,�P於更多的 test 用法,老�一句:�看 man page 吧�u  ^_^

�m然洋洋��⒅v了一大堆,或�S你�在嘀咕.... 那... 那�� return value 有啥用啊?�u
��得好�u
告�V你:return value 的作用可大了�u若你想�你的 shell �"�明"的�,就全靠它了:
* 有了 return value,我��可以� shell 跟��不同的��B做不同的�r情...

�@�r候,才�我�斫�员菊碌拇鸢赴�~~~  ^_^
&& �c || 都是用��"�M建"多�� command line 用的:
* command1 && command2 :其意思是 command2 只有在 RV �� 0 (true) 的�l件下�绦小�
* command1 || command2 :其意思是 command2 只有在 RV �榉� 0 (false) 的�l件下�绦小�
�恚�以例子�碚f好了:
 

  1. $ A=123
     
  2. $ [ -n "$A" ] && echo "yes! it's ture."
     
  3. yes! it's ture.
     
  4. $ unset A
     
  5. $ [ -n "$A" ] && echo "yes! it's ture."
     
  6. $ [ -n "$A" ] || echo "no, it's NOT ture."
     
  7. no, it's NOT ture.
复制代码


(�]:[ -n string ] 是�y� string �L度大於 0 �t�� true 。)
上例的第一�� && 命令行之所以���绦衅溆疫�的 echo 命令,是因�樯弦�� test 送回了 0 的 RV 值�r
但第二次就不���绦校�因�� test 送回非 0 的�Y果...
同理,|| 右�的 echo ��被�绦校��s正是因�樽筮�的 test 送回非 0 所引起的。

事��上,我��在同一命令行中,可用多�� && 或 || �斫M建呢:
 

  1. $ A=123
     
  2. $ [ -n "$A" ] && echo "yes! it's ture." || echo "no, it's NOT ture."
     
  3. yes! it's ture.
     
  4. $ unset A
     
  5. $ [ -n "$A" ] && echo "yes! it's ture." || echo "no, it's NOT ture."
     
  6. no, it's NOT ture.
复制代码


怎�樱��倪@一刻�_始,你是否�X得我��的 shell 是"很�明"的呢?  ^_^

好了,最後,�阎靡坏懒��}�o大家做做看、、、
下面的判�嗍牵寒� $A 被�x�c值�r,再看是否小於 100 ,否�t送出 too big! :
 

  1. $ A=123
     
  2. $ [ -n "$A" ] && [ "$A" -lt 100 ] || echo 'too big!'
     
  3. too big!
复制代码


若我�� A 取消,照理�f,���不��送文字才�Π�(因�榈谝���l件就不成立了)...
 

  1. $ unset A
     
  2. $ [ -n "$A" ] && [ "$A" -lt 100 ] || echo 'too big!'
     
  3. too big!
复制代码


�楹紊厦娴慕Y果也可得到呢?
又,如何解�Q之呢?
(提示:修改方法很多,其中一�N方法可利用第七章介�B�^的 command group ...)

快�u告我我答案�u其�N免�....
 

你可能感兴趣的:(shell,十三问)