【问题标题】:declare -a/-A matrix (Bash)声明 -a/-A 矩阵 (Bash)
【发布时间】:2021-11-02 21:24:48
【问题描述】:

bash编程中declare -a matrix和declare -A matrix有什么区别?

declare -A matrix
declare -a res

read_matrix() {
    local i=0
    local line
    local j
    while read -r line; do
        j=0
        IFS=,
        for v in $(echo "$line")
        do
            matrix[$i,$j]="$v"
            j=$((j+1))
        done
        i=$((i+1))
    done
}

这是 bash 脚本中的一段,该脚本使用高斯消元法计算线性方程组的解。

【问题讨论】:

  • 运行help declare
  • 顺便说一句,for v in $(echo "$line") 的意义何在?如果你想用逗号分隔你的行,有更好(更安全,更少错误)的方法来做到这一点;例如:IFS=, read -r -a pieces <<<"$line" -- 或者首先将您的 while read -r line; do 更改为 while IFS=, read -r -a pieces; do,然后您可以运行 for v in "${pieces[@]}"; do 来迭代各个部分。
  • 菲·查尔斯。语言。 ;-)
  • 但即使您确实想使用分词来打破逗号,for v in $line; do 也是比for v in $(echo "$line"); do 更有效的方法(而且永远- 稍微少一些错误,只要它减少了基于如何主动配置echo 的行为差异......尽管仍然比read -a 方法有更多错误)
  • @CharlesDuffy 我不知道help declare。谢谢,这很有帮助!我最初以不同的方式编写了这段代码。然后我被告知使用内部字段分隔符 (IFS)。

标签: bash matrix declaration


【解决方案1】:

declare -A matrix 创建一个关联数组:它的键是任意字符串。这是 bash 4.0 中添加的一项功能,在以前的版本中不可用(例如 Apple 发布的 bash 3.2),这就是为什么您可以在密钥中使用逗号的原因。

declare -a matrix 创建一个索引数组:它的键被解释为数字。

【讨论】:

  • 还值得注意的是,关联数组必须declare -A初始化,而任何变量都可以用作索引数组。此外,索引数组的下标(索引)被计算为算术表达式,包括 egvar == 4,如果为真,则计算为 1,如果为假,则计算为 0。
猜你喜欢
  • 2017-11-21
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
  • 2017-09-26
  • 2016-07-01
  • 2014-01-02
  • 1970-01-01
  • 2018-10-19
相关资源
最近更新 更多