shell十三问-9) $@ 与 $* 差在哪?

要�f $@ �c $* 之前,需得先�� shell script 的 positional parameter �起...
我��都已�知道�量(variable)是如何定�x及替�Q的,�@��不用再多�v了。
但是,我���需要知道有些�量是 shell �榷ǖ模�且其名�Q是我��不能�S意修改的,
其中就有 positional parameter 在�取�

在 shell script 中,我��可用 $0, $1, $2, $3 ... �@�拥淖�量分�e提取命令行中的如下部份:
 

  1. script_name parameter1 parameter2 parameter3 ...
复制代码


我��很容易就能猜出 $0 就是代表 shell script 名�Q(路�)本身,而 $1 就是其後的第一����担�如此�推....
�得留意的是 IFS 的作用,也就是,若 IFS 被 quoting �理後,那�N positional parameter 也��改�。
如下例:
 

  1. my.sh p1 "p2 p3" p4
复制代码


由於在 p2 �c p3 之�g的空白�I被 soft quote 所�P�]了,因此 my.sh 中的 $2 是 "p2 p3" 而 $3 �t是 p4 ...

��得前�烧挛��提到 fucntion �r,我不是�f�^它是 script 中的 script �幔�  ^_^
是的,function 一�涌梢宰x取自己的(有�e於 script 的) postitional parameter ,惟一例外的是 $0 而已。
�e例而言:假�O my.sh �e有一�� fucntion 叫 my_fun , 若在 script 中跑 my_fun fp1 fp2 fp3 ,
那�N,function �鹊� $0 是 my.sh ,而 $1 �t是 fp1 而非 p1 了...

不如������蔚� my.sh script  看看吧:
 

  1. #!/bin/bash
     

  2.  
  3. my_fun() {
     
  4.     echo '$0 inside function is '$0
     
  5.     echo '$1 inside function is '$1
     
  6.     echo '$2 inside function is '$2
     
  7. }
     

  8.  
  9. echo '$0 outside function is '$0
     
  10. echo '$1 outside function is '$1
     
  11. echo '$2 outside function is '$2
     

  12.  
  13. my_fun fp1 "fp2 fp3"
复制代码


然後在 command line 中跑一下 script 就知道了:
 

  1. chmod +x my.sh
     
  2. ./my.sh p1 "p2 p3"
     
  3. $0 outside function is ./my.sh
     
  4. $1 outside function is p1
     
  5. $2 outside function is p2 p3
     
  6. $0 inside function is ./my.sh
     
  7. $1 inside function is fp1
     
  8. $2 inside function is fp2 fp3
复制代码



然而,在使用 positional parameter 的�r候,我��要注意一些陷阱哦:
* $10 不是替�Q第 10 ����担�而是替�Q第一�����($1)然後再�a一�� 0 於其後�u
也就是,my.sh one two three four five six seven eigth nine ten �@�拥� command line ,
my.sh �e的 $10 不是 ten 而是 one0 哦... 小心小心�u
要抓到 ten 的�,有�煞N方法:

方法一是使用我��上一章介�B的 ${ } ,也就是用 ${10} 即可。

方法二,就是 shift 了。
用通俗的�f法�碚f,所�^的 shift 就是取消 positional parameter 中最左�的���( $0 不受影�)。
其�A�O值�� 1 ,也就是 shift 或 shift 1  都是取消 $1 ,而原本的 $2 �t�成 $1、$3 �成 $2 ...
若 shift 3 �t是取消前面三����担�也就是原本的 $4 �⒆�成 $1 ...
那,�H�鄣淖x者,你�f要 shift 掉多少����担�才可用 $1 取得 ${10} 呢? ^_^

okay,��我���� positional parameter 有了基本概念之後,那再�我��看看其他相�P�量吧。
首先是 $# :它可抓出 positional parameter 的�盗俊�
以前面的 my.sh p1 "p2 p3" �槔�:
由於 p2 �c p3 之�g的 IFS 是在 soft quote 中,因此 $# 可得到 2 的值。
但如果 p2 �c p3 �]有置於 quoting 中�,那 $# 就可得到 3 的值了。
同�拥牡览碓� function 中也是一�拥�...

因此,我��常在 shell script �e用如下方法�y� script 是否有�x�M��担�
 

  1. [ $# = 0 ]
复制代码


假如�� 0 ,那就表示 script �]有��担�否�t就是有����...

接下�砭褪� $@ �c $* :
精�_�碇v,�烧咧挥性� soft quote 中才有差��,否�t,都表示"全部���"( $0 除外)。
�e例�碚f好了:
若在 command line 上跑 my.sh p1 "p2 p3" p4 的�,
不管是 $@ �是 $* ,都可得到 p1 p2 p3 p4 就是了。
但是,如果置於 soft quote 中的�:
"$@" �t可得到 "p1" "p2 p3" "p4" �@三��不同的�~段(word)�r
"$*" �t可得到 "p1 p2 p3 p4" �@一整串�我坏脑~段。

我��可修改一下前面的 my.sh ,使之�热萑缦拢�
 

  1. #!/bin/bash
     

  2.  
  3. my_fun() {
     
  4.     echo "$#"
     
  5. }
     

  6.  
  7. echo 'the number of parameter in "$@" is '$(my_fun "$@")
     
  8. echo 'the number of parameter in "$*" is '$(my_fun "$*")
复制代码



然後再�绦� ./my.sh p1 "p2 p3" p4 就知道 $@ �c $* 差在哪了 ...    ^_^

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