脚本具有以下内容:
#/bin/bash
path_elements=$(echo $PATH | tr ":" " ")
echo ${#path_elements[*]}
我的PATH变量包含多个目录。但是,运行时,输出返回:
1
为什么这不会返回$ PATH中的目录数量?需要什么来解决这个问题?
答案 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。