• Shell中的$@和$*的区别


    我们都知道,在shell中 $@ 和 $* 都会获取传递给脚本或函数时所有的参数。
    但其中有细微区别。

    接下来,笔者将用一个shell脚本将其中的区别展现给大家。

    [root@master scripts]# cat test.sh 
    #!/bin/bash
    
    echo '单引号@是:$@'
    echo "双引号@是:$@"
    echo '单引号*是:$*'
    echo "双引号*是:$*"
    echo "@没有引号:"$@
    echo "*没有引号:"$*
    
    echo '这是双引号$@的遍历'
    for i in "$@"
    do
        echo $i
    done
    
    
    echo '这是没有引号$@的遍历'
    for i in $@
    do
        echo $i
    done
    
    echo '这是双引号$*的遍历'
    for i in "$*"
    do
        echo $i
    done
    
    echo '这是没有引号$*的遍历'
    for i in $*
    do
        echo $i
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    在使用 echo 命令时,总共会有3中情况,不加引号、加单引号、加双引号。
    单引号的作用:所见即所得,不对内容作任何解析,输入什么,就输出什么。
    双引号的作用:对输入内容中的特殊符号进行解析。

    由于单引号最终的结果是将原内容重新输出,我们无法区分出 $@ 和 $* 的区别,在此处便没有讨论的意义,所以只有4个循环遍历的结构。

    接下来执行脚本,并传递给脚本4个参数 a b c d

    sh test.sh a b c d
    
    • 1

    最终的得到的结果如下:

    [root@master scripts]# sh test.sh a b c d
    单引号@是:$@
    双引号@是:a b c d
    单引号*是:$*
    双引号*是:a b c d
    @没有引号:a b c d
    *没有引号:a b c d
    这是双引号$@的遍历
    a
    b
    c
    d
    这是没有引号$@的遍历
    a
    b
    c
    d
    这是双引号$*的遍历
    a b c d
    这是没有引号$*的遍历
    a
    b
    c
    d
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    从执行脚本的结果我们不难发现:
    1)单引号对变量内容不会作任何解析,所见即所得。
    2)加双引号与不加双引号,$@会把所有传递的参数内容输出,并且每个参数个体都是独立的。如脚本结果所示,几个参数,就遍历循环几次。
    3)加双引号,$*会把所有传递的参数内容输出,并且将所有参数作为一个整体。如脚本结果所示,4个参数,却只循环遍历了一次;不加双引号,作用与$@相同。
    4)一般使用时,尽量还是在echo后面给输出的内容加上引号,一方面是为了更加规范,另一方面是,让我们所写的变量或者特殊符号去发挥它本应起到的作用,就像$@$*一样。

  • 相关阅读:
    加密磁盘密钥设置方案浅析 — LUKS1
    编程学:关于同类词的等长拼写问题
    软件测试-基本概念
    Linux——网络编程总结性学习
    “智能合约审计:确保区块链应用安全的关键步骤“
    【Java基础面试十五】、 说一说你对多态的理解
    Medical transformer源码解读
    记录一次Linux挂载NAS共享的SMB文件系统经历
    【LeetCode: 67. 二进制求和 | 位运算 】
    Java中stream是什么?有什么作用?如何使用?
  • 原文地址:https://blog.csdn.net/oldboy1999/article/details/128130337