如何在Bash中将@数组分配给另一个变量?

6

在回答如何在Bash中复制数组的问题时,将一个数组从一个变量复制到另一个变量的解决方案是arrayClone=("${oldArray[@]}")

但是,如果我需要复制的数组是参数列表@呢?

像这样的一个简单的测试脚本:

#! /bin/bash

argsCopy=("${@[@]}")

出现错误:

第3行:${@[@]}:错误的替换


2
请注意,"$@"来自POSIX sh(以及之前的shell),而数组是一个较新的扩展。因此,认为存在一个名为@的数组是不准确的;更准确的是,数组是一种单独且独特(更新!)的语言特性,其语法受到基线POSIX语法"$@""$*"的启发,作为访问当前上下文命令行参数列表的机制。 - Charles Duffy
1个回答

6

通过实验,似乎 argsCopy=("$@") 就足够了。

当我通过 ./test.sh 1 2 3\ 4 运行以下内容时,

#! /bin/bash

set -x
argsCopy=("$@")
echo "${argsCopy[@]}" > /dev/null

它会输出:

+ argsCopy=("$@")
+ echo 1 2 '3 4'

然而,就像sh/bash中的许多东西一样,我无法解释语言规则是如何导致这种情况发生的,或者在什么情况下可能会失败。


2
顺便说一下,这根本不是合法的 sh 语言,只有 bash/ksh/&c. 支持数组。 - Charles Duffy
1
关于相关的语法规则,请参见手册中的“特殊参数”部分。链接 - Charles Duffy
@CharlesDuffy 谢谢,所有的笔记都非常有帮助! - natevw
手册中的关键部分是解释 "$@" 相当于 "$1" "$2" …。这绝对是一种奇怪的不一致性,我不会想在其他语言中找到它,但我猜这就是为什么这些参数被特别记录的一部分... - natevw
是的,这种不对齐的情况就是由于几十年的向后兼容性(以及新添加功能的语法从未指定的空间中刻画出来)所导致的。 :/ - Charles Duffy
1
在设置someArray =(“ first item”“ second item”)后,"${someArray [@]}"的扩展相当于"${someArray [0]}" "${someArray [1]}"-在扩展中每个数组元素都作为单独的单词,因此"$ @" ${someArray [@]}”之间的语法在这个方面至少是一致的。从常见用例的合理行为角度来看,不包含"$0""$@"`是易于辩护的,但它确实打破了对称性。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接