Chinaunix首页 | 论坛 | 博客
  • 博客访问: 364931
  • 博文数量: 83
  • 博客积分: 5322
  • 博客等级: 中校
  • 技术积分: 1057
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-11 11:27
个人简介

爱生活,爱阅读

文章分类

全部博文(83)

文章存档

2015年(1)

2013年(1)

2012年(80)

2011年(1)

分类: LINUX

2012-03-09 15:16:48

--------------------------------------------------------------------------------------------------------------------------------

--------------------------------------收集于网络:网中人---shell 十三问》----------------------------------

--------------------------------------------------------------------------------------------------------------------------------

要说 $@ $* 之前,需得先从 shell script positional parameter 谈起...

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

 

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

script_name parameter1 parameter2 parameter3 ...

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

$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  看看吧:

 

#!/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 就知道了:

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 的值了。

 

接下来就是 $@ $* ,精确来讲,两者只有在 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 ,使之内容如下:

 

#!/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 就知道 $@ $* 差在哪了 ...    ^_^

[admin@localhost empty]$ ./my.sh  p1 "p2 p3" p4

the number of parameter in "$@" is 3

the number of parameter in "$*" is 1

阅读(725) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~