shell脚本的位置参数


$@和$*差在哪?

除了我们自定义的变量之外,shell内定了一些变量,且其名称是我们不能随意更改的,其中就有位置参数(positional parameter)变量。

在shell脚本中,我们可以使用$0, $1, $2, ...,${10}...这样的变量分别提取命令行中的如下部分:

script_name parameter1 parameter2 parameter3 ...

$0 代表shell脚本的名称(路径)本身,如上script_name
$1 代表脚本名称后的第1个参数,如上parameter1,以此类推...

注意:要留意系统环境变量IFS的设定,如果有过更改,位置参数也会相应的发生改变

函数function中的位置变量
函数同样可以读取自己的位置参数,但和脚本有些不同,唯一例外的是$0。

# 举例说明
# 假设my.sh中有一个叫做my_fun的函数,若在脚本中调用该函数my_fun fp1 fp2 fp3
# 那么,函数的$0是my.sh,而$1则是fp1 ... 
# 代码

#!/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" 

运行上面的my.sh

$ 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 

在使用位置参数的时候,我们要注意一些陷阱:
比如:$10不是替换第10个参数,而是替换第一个参数($1)然后再补一个0于其后!也就是,执行my.sh one two three four five six seven eigth nine ten这样的命令,my.sh里的$10 不是ten而是one0

要得到ten的话,有两种方法:

  • 使用${ },也就是用${10}即可
  • 使用shift
    用通俗的说法来说,所谓的shift就是取消positional parameter中最左边的参数($0 不受影响)。其默认值为1,也就是shiftshift 1都是取消$1,而原本的$2则变成 $1、$3变成$2 ... 若shift 3则是取消前面三个参数,也就是原本的$4将变成$1 ...

让我们看看其它相关变量吧

首先是$# :它可得到位置参数的数量。

以前面的 my.sh p1 "p2 p3" 为例:

由于p2与p3之间的IFS是在soft quote中,因此$#可得到2的值。

但如果p2与p3没有置于quoting中话,那$#就可得到3的值了。

同样的道理在function中也是一样的...

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

# 代码: 
[ $# = 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,使之内容如下:

# 代码: 
#!/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 就知道 $@ 与 $* 差在哪了 ...

$ ./my.sh p1 "p2 p3" p4
the number of parameter in "$@" is 3
the number of parameter in "$*" is 1
 posted on 2020-05-31 10:19  WarningMessage  阅读(728)  评论(0编辑  收藏  举报