有人可以解释一下“${files[@]}”的作用吗

有人可以解释一下“${files[@]}”的作用吗

我正在编写一个脚本来压缩旧文件,在在线示例中我发现了以下内容。我想详细了解"${files[@]}"特殊字符的含义或如何读取。"${files[@]}"

files=($(find /var/cdrs -maxdepth 1 -name \*.C*R -mtime +150))
tar cvfz /var/cdrs_backup/CDRBackup_$(date +%Y%m%d_%H%M%S).tar.gz "${files[@]}"

答案1

简而言之,您创建一个files数组并对其进行扩展。

你这样读:

VAR=...意味着您正在分配一个变量。VAR=(...)意味着您正在将 bash 数组分配给变量。

$(...)意味着您正在运行命令并捕获其输出,在您的情况下,是与给定模式相匹配的文件列表,这些文件非常旧,然后将每个文件分配给 bash 数组中的一个元素。

${...}表示您正在读取变量的值,例如:

$ SOMEVAR="a value"
$ echo "${SOMEVAR}"
a value

在 bash 中$VAR${VAR}是等效的,但是该${VAR}符号允许您做一些额外的事情。最值得注意的是,echo "${VAR}iable"将扩展$VAR变量并将其与iable字符串连接,而echo $VARiable将尝试扩展$VARiable变量。你也可以做一些高级替代使用${...}符号。

在我们的例子中,我们正在读取文件变量${file...}。接下来,[...]表示我们正在阅读bash数组。所以我们试图访问 files 数组的一个元素,里面的位[...]告诉我们哪些元素,这可以是1访问第一个元素,2访问第二个元素等等(bash 数组从 1 开始索引,而不是从 0 开始)。@表示所有元素,因此我们尝试访问名为 的 bash 数组的所有元素file

您可以尝试使用以下方法:

% ARRAY=("a value" "another value" "fred")
% for x in "${ARRAY[@]}"; do echo "$x"; done
a value
another value
fred

与仅使用空格分隔的字符串相比,使用数组的优点是您可以在值中包含空格,如上所示。因此,在您的情况下,数组中的每个文件files将被视为单独的参数,并且文件名中的空格将被正确处理。

因此,本质上,您的 snipit 会查找并收集文件列表,并将它们作为单独的参数传递给 tar 命令。

答案2

创建files=(...)了一个大批文件名数

语法的"${files[@]}"意思是_数组的每个元素;即找到的每个文件名。请注意"..."环绕,阻止某些文件名被分割很重要。

(如果任何文件名中包含回车符,则这可能会失败)。

答案3

files=(...)创建一个大批上的字符串ksh,它创建了这种语法,以及后来采用它的 shell 等bash

$(find /var/cdrs -maxdepth 1 -name \*.C*R -mtime +150)创建与指定条件匹配的路径名的空格分隔列表。但是,如果文件名包含 IFS 字符之一(通常是空格、制表符和换行符),则文件名将被分割成多个部分,然后错误地存储在数组中。

"${files[@]}"扩展为字符串列表,其中每个元素都被引用。在这里引用元素是没有用的,因为数组不能包含空格、制表符或回车符,如上一段所述。然后可以通过 稍微简化此语法${files[*]}

相关内容