在回答如何在Bash中复制数组的问题时,将一个数组从一个变量复制到另一个变量的解决方案是arrayClone=("${oldArray[@]}")
。
但是,如果我需要复制的数组是参数列表@
呢?
像这样的一个简单的测试脚本:
#! /bin/bash
argsCopy=("${@[@]}")
出现错误:
第3行:${@[@]}:错误的替换
在回答如何在Bash中复制数组的问题时,将一个数组从一个变量复制到另一个变量的解决方案是arrayClone=("${oldArray[@]}")
。
但是,如果我需要复制的数组是参数列表@
呢?
像这样的一个简单的测试脚本:
#! /bin/bash
argsCopy=("${@[@]}")
第3行:${@[@]}:错误的替换
通过实验,似乎 argsCopy=("$@")
就足够了。
当我通过 ./test.sh 1 2 3\ 4
运行以下内容时,
#! /bin/bash
set -x
argsCopy=("$@")
echo "${argsCopy[@]}" > /dev/null
它会输出:
+ argsCopy=("$@")
+ echo 1 2 '3 4'
然而,就像sh/bash中的许多东西一样,我无法解释语言规则是如何导致这种情况发生的,或者在什么情况下可能会失败。
"$@"
相当于 "$1" "$2" …
。这绝对是一种奇怪的不一致性,我不会想在其他语言中找到它,但我猜这就是为什么这些参数被特别记录的一部分... - natevwsomeArray =(“ first item”“ second item”)
后,"${someArray [@]}"
的扩展相当于"${someArray [0]}" "${someArray [1]}"
-在扩展中每个数组元素都作为单独的单词,因此"$ @"
和${someArray [@]}”之间的语法在这个方面至少是一致的。从常见用例的合理行为角度来看,不包含
"$0"的
"$@"`是易于辩护的,但它确实打破了对称性。 - Charles Duffy
"$@"
来自POSIX sh(以及之前的shell),而数组是一个较新的扩展。因此,认为存在一个名为@
的数组是不准确的;更准确的是,数组是一种单独且独特(更新!)的语言特性,其语法受到基线POSIX语法"$@"
和"$*"
的启发,作为访问当前上下文命令行参数列表的机制。 - Charles Duffy