【问题标题】:What are some use cases of "$*" in bash?bash 中有哪些“$*”用例?
【发布时间】:2015-07-16 22:49:13
【问题描述】:

来自 bash 手册页:

"$*" 等价于"$1c$2c...",其中cIFS 变量值的第一个字符。

"$@" 等价于"$1" "$2" ...

"$@" 不能代替 "$*" 的任何示例?

【问题讨论】:

    标签: bash parameters arguments command-line-arguments


    【解决方案1】:

    我最喜欢的用途是替换字段分隔符。

    $ set -- 'My word' but this is a bad 'example!'
    $ IFS=,
    $ echo "$*"
    My word,but,this,is,a,bad,example!
    

    还有其他方法可以替换分隔符,但 IFS 和 "$*" 通常是最简单的方法之一。

    【讨论】:

    • 确实如此。我经常使用 printf -v output '%s,' "$@" 来完成相同的任务,但是会留下一个尾随的 , 需要被剥离(虽然 output=${output%,} 做的很短,但这并不完全漂亮)。
    【解决方案2】:

    这些是完全不同的工具,应该在完全不同的情况下使用。用一个代替另一个是没有合理的问题的,因为在任何给定的情况下,只有一个或另一个是正确的。

    "$*" 最适用于您尝试从参数列表中形成单个字符串参数 - 主要用于日志记录(但不是参数之间的划分很重要的情况;然后,"$@" 适合类似print '%q ')。 "$@" 在......好吧,任何其他情况下都很有用。

    例子:

    die() {
        local stat=$1; shift
        log "ERROR: $*"
        exit $stat
    }
    

    在格式化要传递给log 的字符串时使用"$*" 仅使用一个argv 条目,从而允许将来将其他可选位置参数添加到log 的使用中。

    【讨论】:

    • 我认为另一种说法是,“一个人可以做另一个人的工作的唯一时间是当两者都被错误地使用时。”
    【解决方案3】:

    $* 将所有参数扩展为一个单词,参数之间带有 IFS。

    $@ 以列表的形式扩展到所有参数。

    在名为 list.sh 的文件中尝试下一个代码:

    #!/bin/bash
    
    echo "using '$*'"
    for i in "$*"
    do
        echo $i
    done
    
    echo "using '$@'"
    for i in "$@"
    do
        echo $i
    done
    

    使用它:

    ./list.sh apple pear kiwi
    

    【讨论】:

    • OP 已经清楚地知道了这一点——他们的问题不是两者有何不同,而是考虑到$@ 的可用性,$* 的实际用途是什么。
    • (顺便说一句,作为正确性的一点,echo "$i" 会比echo $i 更好;否则,glob 会被扩展,空格的运行会被压缩,等等;可以通过使用 @ 来做出额外的改进987654327@ 代替,这将更正使用 -n 等参数的处理,否则 echo 会消耗自身)。
    猜你喜欢
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2017-02-13
    • 2011-05-04
    • 1970-01-01
    • 2015-04-04
    • 2011-01-12
    • 2021-10-30
    相关资源
    最近更新 更多