我试图获得数组的长度有什么问题?

时间:2015-05-21 17:47:44

标签: arrays linux bash

脚本具有以下内容:

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

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

  

1

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

1 个答案:

答案 0 :(得分:3)

你只需要用空格代替冒号来读取单个字符串(用空格替换文字制表符,扩展glob表达式,以及你可能不想要的各种其他行为);因此,当你询问数组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