我试图在子目录中获得我的顶级目录列表,因此我可以对它们进行post处理,例如,删除某些目录。我有
# List the top-level dirs and create an array with the resul
DIRS=`ls -1`
IFS=$'n' read -ra TOP_DIRS <<< "$DIRS"
# Iterate the array
for D in "${TOP_DIRS[@]}"; do
# For now, just echo the dirs
echo $D
done
ls -1
命令给出如下示例
00 PRM - AUTO GA
00 PRM - AUTO GA Prod
00 PRM - AUTO GA Prod@script
00 PRM - AUTO GA Prod@script@tmp
00 PRM - AUTO GA STG
00 PRM - AUTO GA STG@script
00 PRM - AUTO GA STG@script@tmp
但是,for
循环只回显第一个值,即
$ ./clean_workspace.sh
00 PRM - AUTO GA
显然我的IFS
声明是错误的。我错过了什么?蒂娅!
不需要ls
。只需在数组文字中使用通配符。
top_dirs=(*)
顺便说一句,使用大写的变量名是不好的风格。这些通常为环境变量保留。
只是解决为什么OP的当前代码只处理一个目录的问题…
read
被设计为读取单行输入,因此OP的当前代码只读取并存储第一个目录:
$ IFS=$'n' read -ra TOP_DIRS <<< "$DIRS"
$ typeset -p TOP_DIRS
declare -a TOP_DIRS=([0]="00 PRM - AUTO GA")
mapfile
设计用于处理多行输入,将每个行存储在一个新的数组项中,例如:
$ mapfile -t TOP_DIRS <<< "$DIRS"
$ typeset -p TOP_DIRS
declare -a TOP_DIRS=([0]="00 PRM - AUTO GA" [1]="00 PRM - AUTO GA Prod" [2]="00 PRM - AUTO GA Prod@script" [3]="00 PRM - AUTO GA Prod@script@tmp" [4]="00 PRM - AUTO GA STG" [5]="00 PRM - AUTO GA STG@script" [6]="00 PRM - AUTO GA STG@script@tmp")
注意:这并没有否定为什么你不应该尝试解析ls