arrays - 我尝试获取数组长度有什么问题?

标签 arrays linux bash

脚本具有以下内容:

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

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

1

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

最佳答案

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


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

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

...这是一种不正确的、有缺陷的读入数组的方法(至少创建了一个数组 - 但不能正确处理带有空格的目录名称,错误地扩展全局变量,并导致一堆问题):

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

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

关于arrays - 我尝试获取数组长度有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30380903/

相关文章:

javascript - 编写一个通用实用程序,可以从 javascript 中的任何数组中删除重复项

linux - 如何在 PF_UNIX 套接字的服务器端打印客户端 sun_paths 名称?

linux - 如何使用销售脚本在格式为 key=value 的属性文件中搜索值?

linux - Minicom 黑色背景颜色不受尊重

linux - 来自 .bashrc 的 bash 函数不会 cd 到文件夹

linux - 将文件夹内容递归移动到嵌套文件夹中

javascript - 获取对象数组并按字母顺序排序为更小的数组

javascript - 在 javascript/jquery 中根据 div 类型从低到高对 div 数组进行排序

c - 当我输入数组中元素的值时,在 for 循环中,在 for 循环之后然后进行转换

bash - 如何将 && 与我自己的函数一起使用?