zoukankan      html  css  js  c++  java
  • shell script中的$*和$@

      在shell script中,$*和$@都是获取所有的命令行参数,但是这两者在使用的过程中会有细微的差别,差别主要是在有没有使用双引号,即是直接使用$*,$@,还是使用"$*","$@"。

    直接使用$*,$@

    #!/bin/bash
    
    count=1
    for param in $*;do
        echo "$* Parameter #$count = $param"
        count=$[ $count + 1 ]
    done
    
    count=1
    for param in $@;do
        echo "$@ Parameter #$count = $param"
        count = $[ $count + 1 ]
    done

    如果执行该脚本,并且输入a b c d命令行参数,那么使用$*和$@的for循环输出都是一样的:

    原因是shell进行参数替换后,两个for循环是一样的,下面是进行参数替换后脚本的形式:

    #!/bin/bash
    
    count=1
    for param in a b c d;do
        echo "$* Parameter #$count = $param"
        count=$[ $count + 1 ]
    done
    
    count=1
    for param in a b c d;do
        echo "$@ Parameter #$count = $param"
        count = $[ $count + 1 ]
    done

    使用双引号的"$*", "$@"

    #!/bin/bash
    
    count=1
    for param in "$*";do
        echo "$* Parameter #$count = $param"
        count=$[ $count + 1 ]
    done
    
    count=1
    for param in "$@";do
        echo "$@ Parameter #$count = $param"
        count = $[ $count + 1 ]
    done

    同样输入参数a b c d,运行结果如下:

    原因是"$*"进行参数替换后成为"a b c d"(由环境变量IFS的第一个字符来分割它们),和普通的"$variable"没有什么区别,而"$@"进行参数替换后很特别,成为"a" "b" "c" "d"(由空格分割它们)。也就是说,"$*"被替换成"$1 $2 ... $N",而"$@"被替换成"$1"   "$2"  ...  "$N",前者所有参数包围在双引号之内,被shell当成一个参数对待,双引号内部的参数仍然由空格分隔,后者每个参数单独被双引号包围,参数与参数之间由空格分隔。因此,该脚本被替换后的形式为:

    #!/bin/bash
    
    count=1
    for param in "a b c d";do
        echo "$* Parameter #$count = $param"
        count=$[ $count + 1 ]
    done
    
    count=1
    for param in "a" "b" "c" "d";do
        echo "$@ Parameter #$count = $param"
        count = $[ $count + 1 ]
    done
  • 相关阅读:
    项目冲刺——第三篇
    项目冲刺——第五篇
    项目冲刺——第四篇
    团队作业第3周——需求改进&系统设计
    复审与事后分析
    事后诸葛亮分析报告
    团队作业第5周——测试与发布(Alpha版本)
    第四周进销存管理系统冲刺博客汇总
    第三篇 进销存管理系统冲刺博客
    团队作业第3周——需求改进&系统设计
  • 原文地址:https://www.cnblogs.com/chaoguo1234/p/5560408.html
Copyright © 2011-2022 走看看