代码之家  ›  专栏  ›  技术社区  ›  Francisco Laferrière

$@在选择多个文件时的行为如何?

  •  1
  • Francisco Laferrière  · 技术社区  · 7 年前

    所以,假设我有6个类型都相同的文件。在我的特定情况下,所有这些文件都是zip文件,我希望选择所有这些文件并通过一个shell脚本“传递”它们,该脚本将“解压”所有文件。

    我已经可以一个接一个地进行选择,就像脚本所做的那样:

    #!/bin/bash
    DIR=$(dirname "$@")
    exec unzip "$@" -d "${DIR}"
    

    所以它将“zip文件”解压到我的位置。
    现在,当我选择多个文件(即多个文件)时。我不知道会发生什么,因为我不完全理解脚本中“解析”的内容。
    我找到了这个 What does $@ mean in a shell script?

    所以我想知道如何做对。 谢谢。

    2 回复  |  直到 7 年前
        1
  •  4
  •   Charles Duffy    7 年前

    修复脚本:迭代参数

    如果您正在调用命令(如 unzip )一次只接受一个参数(您想要传递的类型),然后需要对其进行迭代。即:

    #!/bin/bash
    for arg in "$@"; do       # or just "for arg do"
      dir=$(dirname "$arg")
      unzip "$arg" -d "$dir"
    done
    

    字面回答(原始语法的作用)

    "$@" 展开到位置参数的完整列表。这在实践中意味着什么?

    假设您的代码是通过以下方式调用的:

    ./yourscript "Directory One/file1.zip" "Directory Two/file2.zip"
    

    在这种情况下,您可以:

    # this is what your code would try to do (it's an error!)
    DIR=$(dirname "Directory One/file1.zip" "Directory Two/file2.zip")
    

    ...然后:

    # also doesn't work, since "unzip" only takes a single zipfile argument
    # ...and because the above dirname fails, DIR is empty here
    unzip "Directory One/file1.zip" "Directory Two/file2.zip" -d "$DIR"
    
        2
  •  0
  •   Charles Duffy    7 年前

    引用自 the official manual :

    @ -展开到位置参数,从一开始。当展开发生在双引号内时,每个参数展开为一个单独的字。也就是说, "$@" 相当于 "$1" "$2" ... . 如果双引号展开发生在单词内,则第一个参数的展开与原始单词的开头部分连接,最后一个参数的展开与原始单词的最后部分连接。如果没有位置参数, "$@" $@ 展开为空(即,它们被删除)。