http://blog.csdn.net/jiankun_wang/article/details/4336285

一、$*和$@

首先介绍两个极其相似、很难区分的特殊参数$*和$@,先看如下输出:

wangjk@wangjiankun:~$ cat test.sh 
     1  #!/bin/bash 
     2 
     3  echo "/$@ is $@" 
     4  echo "/$* is $*" 
     5 
wangjk@wangjiankun:~$ ./test.sh a b c d                                  
$@ is a b c d 
$* is a b c d 
wangjk@wangjiankun:~$

奥,原来$@和$*都是代表所有的输入参数,那它俩有区别吗?再看看下面的输出:

wangjk@wangjiankun:~$ cat test1.sh 
     1  #!/bin/bash 
     2 
     3  set 'apple pie' pears peaches 
     4 
     5  echo 
     6  echo "/$*" 
     7  for i in $* 
     8  do 
     9          echo $i 
    10  done 
    11 
    12  echo 
    13  echo "/"/$*/"" 
    14  for i in "$*" 
    15  do 
    16          echo $i 
    17  done 
    18 
    19  echo 
   20  echo "/$@" 
    21  for i in $@ 
    22  do 
    23          echo $i 
    24  done 
    25 
    26  echo 
    27  echo "/"/$@/"" 
    28  for i in "$@" 
    29  do 
    30          echo $i 
    31  done 
wangjk@wangjiankun:~$ ./test1.sh

$* 
apple 
pie 
pears 
peaches

"$*" 
apple pie pears peaches

$@ 
apple 
pie 
pears 
peaches

"$@" 
apple pie 
pears 
peaches 
wangjk@wangjiankun:~$

上面的输出显示,当$@和$*都不加双引号时,输出结果相同,并且它们都将空格作为字符串的分割符;在加上双引号时,"$*"将所有的输入参数视作是一个字符串,等于“$1 $2 $3”,而"$@"将每一个输入参数视作一个字符串,等于“$1” “$2” “$3”。那么当$@和$*都不加双引号时,它们的输出结果真的永远一样吗?看下面的输出结果:

wangjk@wangjiankun:~$ cat test.sh 
     1  #!/bin/bash 
     2 
     3  echo "/$@ is $@" 
     4  echo "/$* is $*" 
     5  echo "/"/$@/" is "$@"" 
     6  echo "/"/$*/" is "$*"" 
     7 
     8  echo 
     9  IFS="" 
    10  echo "/$@ is $@" 
    11  echo "/$* is $*" 
    12  echo "/"/$@/" is "$@"" 
    13  echo "/"/$*/" is "$*"" 
wangjk@wangjiankun:~$ ./test.sh a b c d 
$@ is a b c d 
$* is a b c d 
"$@" is a b c d 
"$*" is a b c d

$@ is a b c d 
$* is abcd 
"$@" is a b c d 
"$*" is a b c d 
wangjk@wangjiankun:~$

可以看出:脚本输出的上下两部分的不同(红色的abce)是由于在脚本中定义了一个变量IFS的原因,因为除此之外,脚本的上下两部分是完全相同的,看来$@和$*还是有不同的。事实上,$@和$*在分割符的使用上也存在着不同:$@使用的分割符是空格,而$*使用的分割符是变量IFS的第一个字符(注意:IFS变量不是一个字符,而是一个字符序列)。这样就容易解释上面的输出了。

总之,$@和$*有两点不同:

1、分割符的使用不同;

2、对于双引号的解释不同。

下面摘引两本书上对于二者的解释。

一本来自中文书籍,如下:

$*         其值为所有的位置参量

$@        除了被双引号引用的情况,含义与$*相同

"$*"       其值为"$1 $2 $3"

"$@"     "$1" "$2" "$3"

一本来自英文书籍,如下:

$*          Expands to the positional parameters, starting from one. When the expansion occurs within double quotes, it expands to a single word with the value of each parameter separated by the first character of the IFS special varible.

$@         Expands to the positional parameters, starting from one. When the expansion occurs within double quotes, each parameter expands to a separate word.

bash的man手册有如下解释:

*      Expands  to  the positional parameters, starting from one.  When 
       the expansion occurs within double quotes, it expands to a  sin- 
       gle word with the value of each parameter separated by the first 
       character of the IFS special variable.  That is, "$*" is equiva- 
       lent to "$1c$2c...", where c is the first character of the value 
       of the IFS variable.  If IFS is unset, the parameters are  sepa- 
       rated  by  spaces.   If  IFS  is null, the parameters are joined 
       without intervening separators. 
@      Expands to the positional parameters, starting from  one.   When 
       the  expansion  occurs  within  double  quotes,  each  parameter 
       expands to a separate word.  That is, "$@" is equivalent to "$1" 
       "$2"  ...   If the double-quoted expansion occurs within a word, 
       the  expansion  of  the  first  parameter  is  joined  with  the 
       beginning  part  of  the original word, and the expansion of the 
       last parameter is joined with the  last  part  of  the  original 
       word.   When  there  are  no  positional parameters, "$@" and $@ 
       expand to nothing (i.e., they are removed).

二、简单介绍其他的几个容易理解的特殊参量和位置参数

其实,还有很多特殊参数,我在此不一一介绍,下面只介绍几个常用的。

1、$#       以十进制数的形式显示位置参数的个数

2、$0       当前脚本的名称,注意,如果使用命令./scriptname.sh运行脚本,则$0 = = ./scriptname.sh

2、$1、$2、$3、…、${10}、${11}、${12}、…

分别是第一个、第二个、第三个、…、第十个、第十一个、第十二个参数,注意,从第十个开始要加大括号。

bash的几个特殊参数和位置参量的更多相关文章

  1. Oracle12c多租户CDB 与 PDB 参数文件位置探讨、查询 CDB 与 PDB 不同值的参数

    一. Oracle12c多租户CDB 与 PDB 参数文件位置CDB的参数文件依然使用12c以前的SPIFLE,pdb的参数文件不会出现在SPFILE中,而是直接从CDB中继承,如果PDB中有priv ...

  2. Bash中的特殊变量和位置参量

    位置参量:向脚本或函数传递的参数,可以被set命令设置.重置和清空. 1.$$ 当前Shell的PID 2.$- 当前Shell的选项,如果是交互式shell,应该包含字符i,例如$ echo $-h ...

  3. bash的快捷键、特殊参数、历史命令、相关文件

    bash快捷键 Emacs风格 ctrl+p: 方向键 上 ↑ ctrl+n: 方向键下 ↓ ctrl+b: 方向键 ← alt+f: 光标右移一个单词 ctrl+f :方向键 → alt+b: 光标 ...

  4. MySQL 5.6.20-enterprise-commercial的参数文件位置问题

    今天在折腾MySQL的参数文件时,突然发现MySQL 5.6.20-enterprise-commercial-advanced-log这个版本数据库的参数文件my.cnf的位置有点奇怪,如下所示: ...

  5. MATLAB地图工具箱学习心得(二)设计可变参数和位置拾取的“放大镜”式投影程序

    最近刚好因为一些原因整理这方面的内容,所以还是把这篇鸽了一年多的博客顺手写出来了∠( ᐛ 」∠)_.因为是当时课程设计的一部分,程序上难免会有一些不足和bug,在这里将设计的思路分享给大家. 本篇博客 ...

  6. MySQL参数文件位置

    对于linux/unix: mysql --help|grep my.cnf   /etc/my.cnf, /etc/mysql/my.cnf, /usr/local/etc/my.cnf, ~/.m ...

  7. java -jar 参数前后位置说明

    springboot项目启动的时候可以直接使用java -jar xxx.jar这样.下面说说参数的一些讲究 1.-DpropName=propValue的形式携带,要放在-jar参数前面 eg:ja ...

  8. spring.hibernate设置参数的位置问题

    1.spring的注解设置在set方法上 2.hibernate的注解设置在get方法上

  9. shell脚本入门基础知识

    shell 脚本的第一行 #!/bin/bash #!/bin/sh 其实,sh是bash的一个软链接 sh -> bash 变量,字母下划线开头(好像是没有类型的) #普通变量 var1=ni ...

随机推荐

  1. JDBC 学习笔记(四)—— JDBC 加载数据库驱动,获取数据库连接

    1. 加载数据库驱动 通常来说,JDBC 使用 Class 类的 forName() 静态方法来加载驱动,需要输入数据库驱动代表的字符串. 例如: 加载 MySQL 驱动: Class.forName ...

  2. [LOJ#525]「LibreOJ β Round #4」多项式

    [LOJ#525]「LibreOJ β Round #4」多项式 试题描述 给定一个正整数 k,你需要寻找一个系数均为 0 到 k−1 之间的非零多项式 f(x),满足对于任意整数 x 均有 f(x) ...

  3. Eclipse或MyEclipse没有在java类文件上显示Spring图标的问题

    Eclipse或MyEclipse没有在java类文件上显示接口图标的问题解决办法: 前: 后:

  4. 刷题总结——work(ssoj)

    题目: 题目背景 SOURCE:NOIP2015-SHY-5 题目描述 假设现在离 noip 还有 m 天,有 n 个人要去参加比赛.他们每个人都有一个预定的训练量 r[i] ,所以每一天他们都抓紧时 ...

  5. 刷题总结——分糖(ssoj 容斥原理+逆元+快速幂+组合数求插板)

    题目: 题目描述 有 N 个(相同的)糖果,M 个(不同的)小朋友.M 和 N 满足:1≤M≤N≤100000(105).要求:1.每个小朋友都至少有一个糖果.2.不存在正整数 X(X>=2), ...

  6. [USACO13JAN] Cow Lineup (单调队列,尺取法)

    题目链接 Solution 尺取法板子,算是复习一波. 题中说最多删除 \(k\) 种,那么其实就是找一个颜色种类最多为 \(k+1\) 的区间; 统计一下其中最多的颜色出现次数. 然后直接尺取法,然 ...

  7. cf359D Pair of Numbers

    Simon has an array a1, a2, ..., an, consisting of n positive integers. Today Simon asked you to find ...

  8. docker基础——自定义镜像、创建私有仓库、查看 docker 运行状态

    一.自定义镜像 1,案例1 要求:请自定义一个 docker 镜像,基于 hub.c.163.com/library/centos,要求创建出来的镜像在生成容器的时候,可以直接使用 ifconfig ...

  9. poj 2318 TOYS 点与矩形的关系

    题目链接 题意 有一个矩形盒子,\(n(n\leq 5e4)\)条线段将其分成了\(n+1\)个区域(每条线段的两个端点分别在矩形的上边和下边,且线段互不相交).现向盒子中扔\(m(m\leq 5e4 ...

  10. JProfile 9.2 linux安装及windows客户端远程监控

    http://blog.csdn.net/fengzhou0920/article/details/52119039 1.       测试环境 服务器:Linux X64;tomcat 7.0;jd ...