shell十三问之九

  rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C16%5Cclip_filelist.xml">

9) $@ $* 差在哪?

 

 



要说 $@ $* 之前,需得先从 shell script positional parameter 谈起 ...
我们都已经知道变量 (variable) 是如何定义及替换的,这个不用再多讲了。
但是,我们还需要知道有些变量是 shell 内定的,且其名称是我们不能随意修改的,
其中就有 positional parameter 在内。

shell script 中,我们可用 $0, $1, $2, $3 ... 这样的变量分别提取命令行中的如下部份:


CODE:[Copy to clipboard]script_name parameter1 parameter2 parameter3 ...
我们很容易就能猜出 $0 就是代表 shell script 名称 ( 路径 ) 本身,而 $1 就是其后的第一个参数,如此类推 ....
须得留意的是 IFS 的作用,也就是,若 IFS quoting 处理后,那么 positional parameter 也会改变。
如下例:


CODE:[Copy to clipboard]my.sh p1 "p2 p3" p4
由于在 p2 p3 之间的空格键被 soft quote 所关闭了,因此 my.sh 中的 $2 "p2 p3" $3 则是 p4 ...

还记得前两章我们提到 fucntion 时,我不是说过它是 script 中的 script 吗?   ^_^
是的, function 一样可以读取自己的 ( 有别于 script ) postitional parameter ,惟一例外的是 $0 而已。
举例而言:假设 my.sh 里有一个 fucntion my_fun , 若在 script 中跑 my_fun fp1 fp2 fp3
那么, function 内的 $0 my.sh ,而 $1 则是 fp1 而非 p1 ...

不如写个简单的 my.sh script   看看吧:


CODE:[Copy to clipboard]#!/bin/bash

my_fun() {
    echo '$0 inside function is '$0
    echo '$1 inside function is '$1
    echo '$2 inside function is '$2
}

echo '$0 outside function is '$0
echo '$1 outside function is '$1
echo '$2 outside function is '$2

my_fun fp1 "fp2 fp3"
然后在 command line 中跑一下 script 就知道了:


CODE:[Copy to clipboard]chmod +x my.sh
./my.sh p1 "p2 p3"
$0 outside function is ./my.sh
$1 outside function is p1
$2 outside function is p2 p3
$0 inside function is ./my.sh
$1 inside function is fp1
$2 inside function is fp2 fp3
然而,在使用 positional parameter 的时候,我们要注意一些陷阱哦:
* $10
不是替换第 10 个参数,而是替换第一个参数 ($1) 然后再补一个 0 于其后﹗
也就是, my.sh one two three four five six seven eigth nine ten 这样的 command line
my.sh
里的 $10 不是 ten 而是 one0 ... 小心小心﹗
要抓到 ten 的话,有两种方法:

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

方法二,就是 shift 了。
用通俗的说法来说,所谓的 shift 就是取消 positional parameter 中最左边的参数 ( $0 不受影响 )
其默认值为 1 ,也就是 shift shift 1   都是取消 $1 ,而原本的 $2 则变成 $1 $3 变成 $2 ...
shift 3 则是取消前面三个参数,也就是原本的 $4 将变成 $1 ...
那,亲爱的读者,你说要 shift 掉多少个参数,才可用 $1 取得 ${10} 呢? ^_^

okay
,当我们对 positional parameter 有了基本概念之后,那再让我们看看其它相关变量吧。
首先是 $# :它可抓出 positional parameter 的数量。
以前面的 my.sh p1 "p2 p3" 为例:
由于 p2 p3 之间的 IFS 是在 soft quote 中,因此 $# 可得到 2 的值。
但如果 p2 p3 没有置于 quoting 中话,那 $# 就可得到 3 的值了。
同样的道理在 function 中也是一样的 ...

因此,我们常在 shell script 里用如下方法测试 script 是否有读进参数:


CODE:[Copy to clipboard][ $# = 0 ]
假如为 0 ,那就表示 script 没有参数,否则就是有带参数 ...

接下来就是 $@ $*
精确来讲,两者只有在 soft quote 中才有差异,否则,都表示 " 全部参数 "( $0 除外 )
举例来说好了:
若在 command line 上跑 my.sh p1 "p2 p3" p4 的话,
不管是 $@ 还是 $* ,都可得到 p1 p2 p3 p4 就是了。
但是,如果置于 soft quote 中的话:
"$@"
则可得到 "p1" "p2 p3" "p4" 这三个不同的词段 (word)
"$*"
则可得到 "p1 p2 p3 p4" 这一整串单一的词段。

我们可修改一下前面的 my.sh ,使之内容如下:


CODE:[Copy to clipboard]#!/bin/bash

my_fun() {
    echo "$#"
}

echo 'the number of parameter in "$@" is '$(my_fun "$@")
echo 'the number of parameter in "$*" is '$(my_fun "$*")
然后再执行 ./my.sh p1 "p2 p3" p4 就知道 $@ $* 差在哪了 ...    ^_^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值