美文网首页Shell语言用例
Bash里面$@和$*的区别

Bash里面$@和$*的区别

作者: CodingCode | 来源:发表于2018-10-13 16:36 被阅读1次

Bash里面$@和$*的区别

$@和 $*通常在bash处理命令行参数的时候使用。

相同点

大部分场景下他们是相同的,可以直接通用,表示命令行的所有参数,实际上是由细微差异的,细节的时候要注意区分。

差异点

可以这么理解:

  1. $@表示的是参数的数组类型
    当有多个参数的时候,每个参数占用一个数组元素。
  2. $*表示的是参数的字符串类型
    当有多个参数的时候,所有参数拼成一个长字符串作为一个参数。

举例

  1. 例子1
$ cat t.sh 
#!/bin/bash
echo "\$@=["$@"]"
echo "\$*=["$*"]"

$ ./t.sh 
$@=[]
$*=[]

$ ./t.sh aa bb
$@=[aa bb]
$*=[aa bb]

两者并无差异。

  1. 例子2
$ cat t.sh 
#!/bin/bash
echo "----0"
for i in $@; do echo "\$i=["$i"]"; done
echo "----1"
for i in $*; do echo "\$i=["$i"]"; done
echo "----2"

for i in "$@"; do echo "\$i=["$i"]"; done
echo "----3"
for i in "$*"; do echo "\$i=["$i"]"; done
echo "----4"

$ ./t.sh 
----0
----1
----2
----3
$i=[]
----4

$ ./t.sh aaa bbb
----0
$i=[aaa]
$i=[bbb]
----1
$i=[aaa]
$i=[bbb]
----2
$i=[aaa]
$i=[bbb]
----3
$i=[aaa bbb]
----4

这里我们看到$@和$*在没有双引号括起来的时候行为是一样的,而当使用双引号括起来的时候是不一样的。

  1. 对于$@假定是数组,那么数组为空,就是没有元素

  2. 对于$是字符串,字符串为空时,表示空串,但不为空值,所以在遍历
    $
    的时候能够找到一个元素,尽管这个元素的值是空串。

  3. 例子3
    这个例子调用子程序,并且把$@和 $*作为参数传递给子程序。

$ cat t.sh 
#!/bin/bash

./tt.sh $@
./tt.sh $*

./tt.sh "$@"
./tt.sh "$*"
$ cat tt.sh 
#!/bin/bash

echo "size="$# "\$@=["$@"]" "\$*=["$*"]"

$ ./t.sh 
size=0 $@=[] $*=[]
size=0 $@=[] $*=[]
size=0 $@=[] $*=[]
size=1 $@=[] $*=[]

$ ./t.sh aa bb
size=2 $@=[aa bb] $*=[aa bb]
size=2 $@=[aa bb] $*=[aa bb]
size=2 $@=[aa bb] $*=[aa bb]
size=1 $@=[aa bb] $*=[aa bb]

例子3也说明"$*"是一个字符串,当没有参数是,字符串为空,表示字符串的值为空串,并不是参数整个为空;这类似高级语言里面的null和"",如果是字符串那么他不会为null,只会是"",所以$#计算出来的值为1。

相关文章

  • Bash里面$@和$*的区别

    Bash里面$@和$*的区别 $@和 $*通常在bash处理命令行参数的时候使用。 相同点 大部分场景下他们是相同...

  • bash和sh的区别

    问题:我们通常不会赋予bash脚本可执行权限,需要使用的时候使用 sh <脚本名>来执行。因为从可执行程序看,sh...

  • bash [[]] [] {} () 区别

    ()和{}都是把命令组合一起,形成一个命令组。区别是()是起子进程,而{}是当前进程,尤其在命令组中赋值非常重要。...

  • GIT:bash和cmd的区别

    GIT安装后三个部分的区别 Windows系统下安装GIT之后会有三个部分: Git GUI 是一个可视化图形页面...

  • Mac上设置Java环境变量

    说明 如果是用bash,修改/.bash_profile或/.profile。两者的区别:.bash_profil...

  • /etc/profile 和~/.bash_profile区别

    /etc/profile 和~/.bash_profile区别 /etc/profile 为系统的每个用户设置环境...

  • Shell补课

    更改启动shell chsh -s /bin/bash shell目录文件 /etc/shells 区别.bash...

  • shell & bash基础命令及巧用

    shell与bash脚本的区别shell是Linux基础命令解释器bash(Bourne Again shell)...

  • .bash_profile和.bashrc的区别

    /etc/profile 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/pr...

  • /bin/bash和/bin/sh的区别

    [该文不严谨, 文末有补充] 脚本test.sh内容: 执行./test.sh,屏幕输出为: 由此可见,在#!/b...

网友评论

    本文标题:Bash里面$@和$*的区别

    本文链接:https://www.haomeiwen.com/subject/ufioaftx.html