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

时间:2017-12-14 21:53:13

标签: bash shell unix file-io

所以,假设我有6个文件都是同一类型。在我的具体情况下,所有这些都是zip文件,我想选择所有这些文件,然后通过"传递它们。一个shell脚本,#34;解压缩"他们都是。

我已经可以逐个选择,因为脚本只是这样做:

@src[parent::img]

所以它解压缩" zip文件"我到底在哪里 现在,当我选择多个文件(也就是多个文件)时。我不知道会发生什么,因为我不完全理解什么是解析"进入剧本。
我找到了这个What does $@ mean in a shell script?

所以我想知道如何正确行事。 非常感谢。

2 个答案:

答案 0 :(得分:4)

修复脚本:迭代参数

如果你正在调用命令(比如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"

答案 1 :(得分:0)

引自the official manual

  

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