【问题标题】:What is wrong with my attempt to get the length of an array?我尝试获取数组长度有什么问题?
【发布时间】:2020-12-26 01:56:44
【问题描述】:

脚本具有以下内容:

#/bin/bash
path_elements=$(echo $PATH | tr ":" " ")
echo ${#path_elements[*]}

我的 PATH 变量包含多个目录。但是,运行时,输出返回:

1

为什么不返回 $PATH 中的目录数?需要什么来解决这个问题?

【问题讨论】:

  • 如果你想变得狡猾,你可以回答“没什么;你得到了正确的数组长度”。尽管 [*] 而不是 [@] 在风格上不一定是最佳实践——在这两个 确实 存在语义差异的情况下,后者几乎总是更可取。
  • Bash 数组支持很奇怪;允许将常规参数视为长度为 1 的数组只是一个奇怪的问题。

标签: arrays linux bash


【解决方案1】:

您只是在读入一个用空格代替冒号的字符串(用空格代替文字制表符,扩展 glob 表达式,以及您可能不想要的各种其他行为);因此,当您询问数组path_elements 中存在多少个字符串时,您会得到答案 1,因为只有一个字符串(根本不是数组)。


现在,this 是一个数组,也是读取它的最佳实践方式:

# This is the best-practices approach.
IFS=: read -r -a path_elements <<<"$PATH"
echo "${#path_elements[@]}"

...这是读入数组的不正确、有问题的方式(至少确实创建了一个数组——但不能正确处理带有空格的目录名称,错误地扩展 glob,并导致一堆问题):

# This is a buggy antipattern that does, at least, create an array
path_elements=( $(tr ':' ' ' <<<"$PATH") )
echo "${#path_elements[@]}"

有关正确使用数组的更多信息,请参阅BashFAQ #5。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    相关资源
    最近更新 更多