shell十三问-5) var=value?export 前后差在哪

�@次�我����r�G�_ command line ,先�砹私庖幌� bash �量(variable)吧...

所�^的�量,就是利用一��特定的"名�Q"(name)�泶嫒∫欢慰梢宰�化的"值"(value)。

*�O定(set)*
在 bash 中,你可以用 "=" �碓O定或重新定�x�量的�热荩�
        name=value
在�O定�量的�r侯,得遵守如下��t:
        * 等�左右�蛇�不能使用�^隔符�(IFS),也��避免使用 shell 的保留字元(meta charactor)。
        * �量名�Q不能使用 $ 符�。
        * �量名�Q的第一��字母不能是�底�(number)。
        * �量名�Q�L度不可超�^ 256 ��字母。
        * �量名�Q及�量值之大小��是有�^�e的(case sensitive)。

如下是一些�量�O定�r常�的�e�`:
        A= B        :不能有 IFS
        1A=B        :不能以�底珠_�^
        $A=B        :名�Q不能有 $
        a=B                :�@跟 a=b 是不同的(�@不是�e�`,提醒 windows 的使用者要特�e注意)
如下�t是可以接受的�O定:
        A=" B"        :IFS 被�P�]了 (��⒖记懊娴� quoting 章�)
        A1=B        :�K非以�底珠_�^
        A=$B        :$ 可用在�量值��
        This_Is_A_Long_Name=b        :可用 _ �B接�^�L的名�Q或值,且大小��有�e。

*�量替�Q(substitution)*
Shell 之所以��大,其中的一��因素是它可以在命令行中�ψ�量作替�Q(substitution)�理。
在命令行中使用者可以使用 $ 符�加上�量名�Q(除了在用 = �定�x�量名�Q之外),
�⒆�量值�o替�Q出�恚�然後再重新�M建命令行。
比方:
 

  1.         $ A=ls
     
  2.         $ B=la
     
  3.         $ C=/tmp
     
  4.         $ $A -$B $C
复制代码


        (注意:以上命令行的第一�� $ 是 shell prompt ,�K不在命令行之�取�)
必需���{的是,我��所提的�量替�Q,只�l生在 command line 上面。(是的,�我��再回到 command line 吧�u)
仔�分析最後那行 command line ,不�y�l�F在被�绦兄�前(在�入 CR 字符之前),
$ 符����γ恳���量作替�Q�理(�⒆�量值替�Q出�碓僦亟M命令行),最後��得出如下命令行:
 

  1.         ls -la /tmp
复制代码


��得第二章我�大家"�毡乩斫�"的那�删�幔咳裟阃�了,那我�@�e再重�N一遍:
 

若�募夹g���砜矗�shell ��依�� IFS(Internal Field Seperator) �� command line 所�入的文字�o拆解��"字段"(word)。
然後再��μ厥庾址�(meta)先作�理,最後再重�M整行 command line 。


�@�e的 $ 就是 command line 中最�典的 meta 之一了,就是作�量替�Q的�u
在日常的 shell 操作中,我��常��使用 echo 命令�聿榭刺囟ㄗ�量的值,例如:
 

  1.         $ echo $A -$B $C
复制代码


我��已�W�^, echo 命令只�渭��⑵� argument 送至"��瘦�出"(STDOUT,通常是我��的�赡�)。
所以上面的命令��在�赡簧系玫饺缦陆Y果:
 

  1.         ls -la /tmp
复制代码


�@是由於 echo 命令在�绦�r,��先�� $A(ls)、$B(la)、跟 $C(/tmp) �o替�Q出�淼慕Y果。

利用 shell �ψ�量的替�Q�理能力,我��在�O定�量�r就更�殪`活了:
        A=B
        B=$A
�@�樱�B 的�量值就可�^承 A �量"���r"的�量值了。
不�^,不要以"��W�_�"�硖子米�量的�O定,比方�f:
        A=B
        B=C
�@��K不��� A 的�量值�成 C 。再如:
        A=B
        B=$A
        A=C
同�右膊��� B 的值�Q成 C 。
上面是�渭�定�x了���不同名�Q的�量:A �c  B ,它��的值分�e是 B �c  C 。
若�量被重�投��x的�,�t原有�f值�⒈恍轮邓�取代。(�@不正是"可�的量"�幔�  ^_^)
��我��在�O定�量的�r侯,��著�@�c:
        * 用一��名�Q�Υ嬉���抵�
�H此而已。

此外,我��也可利用命令行的�量替�Q能力��"�U充"(append)�量值:
        A=B:C:D
        A=$A:E
�@�樱�第一行我���O定 A 的值�� "B:C:D",然後,第二行再�⒅�U充�� "B:C:D:E" 。
上面的�U充�例,我��使用�^隔符�( : )�磉_到�U充目的,
要是�]有�^隔符�的�,如下是有���}的:
        A=BCD
        A=$AE
因�榈诙�次是�� A 的值�^承 $AE 的提�Q�Y果,而非 $A 再加 E �u
要解�Q此���},我��可用更�乐�的替�Q�理:
        A=BCD
        A=${A}E
上例中,我��使用 {} �⒆�量名�Q的����o明�_定�x出�恚�
如此一�恚�我��就可以�� A 的�量值�� BCD �o�U充�� BCDE 。

(提示:�P於 ${name} 事��上�可做到更多的�量�理能力,�@些均�凫侗容^�M�A的�量�理,
�F�A段��r不介�B了,�大家自行�⒖假Y料。如 CU 的�N子:
http://www.chinaunix.net/forum/viewtopic.php?t=201843
)

* export *

�栏�碚f,我��在��前 shell 中所定�x的�量,均�凫�"本地�量"(local variable),
只有��^ export 命令的"�出"�理,才能成�榄h境�量(environment variable):
 

  1.         $ A=B
     
  2.         $ export A
复制代码


或:
 

  1.         $ export A=B
复制代码


��^ export �出�理之後,�量 A 就能成�橐���h境�量供其後的命令使用。
在使用 export  的�r侯,��e忘� shell 在命令行�ψ�量的"替�Q"(substitution)�理,
比方�f:
 

  1.         $ A=B
     
  2.         $ B=C
     
  3.         $ export $A
复制代码


上面的命令�K未�� A �出�榄h境�量,而是�� B 作�出,
�@是因�樵谶@��命令行中,$A ��首先被替�Q�� B, 然後再"塞回"作 export 的��怠�

要理解�@�� export ,事��上需要�� process 的角度�砝斫獠拍芡�亍�
我�㈧断乱徽�榇蠹艺f明 process 的�^念,敬�留意。

*取消�量*

要取消一���量,在 bash 中可使用 unset 命令�硖�理:
 

  1.         unset A
复制代码


�c export 一�樱�unset 命令行也同���作�量替�Q(�@其��就是 shell 的功能之一),
因此:
 

  1.         $ A=B
     
  2.         $ B=C
     
  3.         $ unset $A
复制代码


事��上所取消的�量是 B 而不是 A 。

此外,�量一旦��^ unset 取消之後,其�Y果是�⒄����量拿掉,而不�H是取消其�量值。
如下�尚衅��是很不一�拥模�
 

  1.         $ A=
     
  2.         $ unset A
复制代码


第一行只是�⒆�量 A �O定��"空值"(null  value),但第二行�t��量 A 不在存在。
�m然用眼睛�砜矗��@�煞N�量��B在如下命令�Y果中都是一�拥模�
 

  1.         $ A=
     
  2.         $ echo $A
     

  3.  
  4.         $ unset A
     
  5.         $ echo $A
     
  6.        
复制代码


��W�T�毡啬茏R�e null value �c unset 的本�|�^�e,�@在一些�M�A的�量�理上是很�栏竦摹�
比方�f:
 

  1.         $ str=                # �O�� null
     
  2.         $ var=${str=expr}        # 定�x var
     
  3.         $ echo $var
     
  4.        
     
  5.         $ echo $str
     
  6.        
     
  7.         $ unset str        # 取消
     
  8.         $ var=${str=expr}        # 定�x var
     
  9.         $ echo $var
     
  10.         expr
     
  11.         $ echo $str
     
  12.         expr
复制代码


�明的�x者(yes, you!),稍加思考的�,
���不�y�l�F�楹瓮��拥� var=${str=expr} 在 null �c unset 之下的不同吧?
若你看不出�恚�那可能是如下原因之一:
a. 你太笨了
b. 不了解  var=${str=expr}        �@���M�A�理
c. �Ρ酒��f明��]�淼眉跋�化吸收
e. 我�v得不好
不知,你�x哪��呢?....  ^_^

嗯... 好吧,我就解�一下 var=${str=expr} :

首先,var=$str �@��大家都可理解吧。
而接下�淼乃伎挤较蚴牵�究竟 $str �@���量是如下哪一�N情�r呢:
1) unset
2) null
3) not null

1) 假如是 unset ,那�N var=${str=expr} 的�Y果�⑹牵�
var=expr
str=expr

2) 假如是 null ,那 var=${str=expr} 的�Y果是:
var=
str=

3) 假如是 not null (比方�� xyz ),那 var=${str=expr} 之�Y果是:
var=xyz
str=xyz

 

接下�恚�再�砜纯� var=${str:=expr} 好了:
1) $str �� not set :
var=expr
str=expr

2) $str �� null :
var=expr
str=expr

3) $str �� not null (str=xyz):
var=xyz
str=xyz

最後比教一下 ${str=expr} �c ${str:=expr} :
* �烧咴� not set �c not null 都一至
* 但�� null 值�r,前者���� $var �c $str 都�O�� null ,但後者�t�O�� expr

�倪@��再延伸出其他�比,不防�大家"��作"�^查一下有何不同?
var=${str-expr} vs var=${str:-expr}
var=${str+expr} vs var=${str:+expr}
var=${str?expr} vs var=${strexpr}

hey you: �e偷�些u快做做看... hurry up!
 

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