【问题标题】:What does run_command() { echo "+" "$@"; "$@"; } means in bash script?run_command() { echo "+" "$@"; 是什么意思? "$@"; } 意味着在 bash 脚本中?
【发布时间】:2018-09-23 17:01:25
【问题描述】:

所以我是新学习 bash 脚本,我想出了以下代码。

run_command() {
  echo "+" "$@"
  "$@"
}

我对“$@”的含义感到困惑,为什么它是两次?

非常感谢您抽出宝贵的时间,祝您有美好的一天。

【问题讨论】:

    标签: bash function arguments


    【解决方案1】:

    Aagam Jain 得到了答案。我将添加一些不适合评论部分的解释。对于冗长的内容,我深表歉意。

    考虑这个例子。

    显示给脚本的参数

    test.sh:

    echo "$1"
    echo "$2"
    

    让我们运行这个脚本并给它两个参数。

    $> bash test.sh ls -l
    

    结果:

    ls
    -l
    

    第一个参数ls,由$1 表示,在第一行回显。第二个参数-l,由$2表示,在第二行回显。

    Bash 手册 - 让我们看看它是怎么说的

    ($@) 展开为位置参数,从一开始

    看到这个:https://www.gnu.org/software/bash/manual/bash.html#Special-Parameters

    这对我们的示例有何影响?让我们稍微改变一下 test.sh。

    从一开始展开参数

    test.sh:

    echo "$@"
    

    让我们运行它。

    $> bash test.sh ls -l
    

    结果:

    ls -l
    

    $@ 在同一行中一个接一个地列出了两个参数。如果你有 5 个参数,它们会一个接一个地打印出来。

    让我们再修改一下 test.sh。

    在回显中添加+

    test.sh:

    echo "+" "$@"
    

    让我们运行它。

    $> bash test.sh ls -l
    

    结果:

    + ls -l
    

    这意味着在打印两个参数之前出现了+

    多修改一下 test.sh。

    执行所有提供的参数

    test.sh:

    echo "+" "@"
    "$@"
    

    让我们运行它。

    bash test.sh ls -l
    

    结果:

    + ls -l
    total 4
    -rw-r--r-- 1 eapo users  0 Sep 23 19:38 file1
    -rw-r--r-- 1 eapo users 19 Sep 23 19:38 test.sh
    

    太好了。正如评论者和 Aagam 所提到的,脚本打印出它要执行的内容(使用echo "+" "$@"),然后执行命令。 "$@" 基本上只是在做ls -lh。终端只是按原样执行它。

    现在让我们在脚本中添加一个函数。

    在脚本中添加函数

    test.sh:

    run_command() {
        echo "+" "$@"
        "$@"
    }
    
    run_command ls -l
    

    请注意,我们是在脚本本身中执行函数,而不是在命令行中给出它

    让我们运行它。

    bash test.sh
    

    结果:

    + ls -l
    total 4
    -rw-r--r-- 1 eapo users  0 Sep 23 19:38 file1
    -rw-r--r-- 1 eapo users 58 Sep 23 19:41 test.sh
    

    希望这些示例带您了解脚本的功能。

    【讨论】:

    • 支持投票:)。很棒的解释。
    • 感谢您的精彩解释!
    • 太棒了。良好的团队合作。 @JennySmith 虽然完全是可选的,但您可能希望通过将 Aagam 的答案标记为已接受并可能也给他一个赞成票来结束您的问题。
    • @JennySmith 您可能希望接受 Aagam 的回答而不是我的回答。 Aagam首先回答,并且是一个准确的答案。我的只是有额外的解释。
    【解决方案2】:

    这会打印命令及其输出。

    例如

    run_command() {
      echo "+" "$@"
      "$@"
    }
    
    run_command ls
    
    #output
    #+ ls
    #files_list_in_current_directory
    

    【讨论】:

    • 但是 "$@" 是怎么做到的呢?我对“$@”是什么感到困惑。
    • @JennySmith 看到这个stackoverflow.com/questions/12314451/…。这将引导您了解“$@”
    • 哦,对不起。 $@ 保存传递给您的函数的参数。
    • @AagamJain 所以它也包含参数和输出?
    • @JennySmith $@ 只是论据。 echo "+" "$@" 运行echo 命令以打印一个“+”,后跟参数,然后"$@" 本身将参数本身作为命令运行(只是让输出转到通常的位置)。因此,如果您运行run_command cp file1 file2,它将执行echo + cp file1 file2,然后执行cp file1 file2
    猜你喜欢
    • 2012-04-19
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多