将ls输出转换为数组

时间:2017-01-05 14:16:20

标签: arrays bash ls

我想将ls的输出放入一个数组中,这样我就可以遍历它并最终使用用户将指定的条目。

我做的是以下

SETUPS="$(ls)"
IFS=$' ' read -rd '' setup <<<"$SETUPS"

当我运行echo $setup[0]时,它会向我显示所有存在的文件 虽然我应该能够运行echo $setup[0]而只能获得第一个条目。

有谁能告诉我我在这里做错了什么?

我已经尝试SETUPS="$(ls -1)"IFS=$'\n' read -rd '' setup <<<"$SETUPS"分开,但这也无效。

现在我像这样循环播放

n=0
for i in `echo ${setup} | tr "," " "` 
   do
   n=$((n+1))
   echo $n". $i"
done

用于回显每个带有前面数字的条目,但我不能选择一个条目,因为每个值似乎都存储为1值

2 个答案:

答案 0 :(得分:2)

如果要获取数组中此目录中的所有文件,可以使用globbing:

files=(*)
printf '%s\n' "${files[@]}"

将在数组files中存储glob匹配的所有文件,然后如果您愿意,可以使用printf打印它们,或者在数组上循环时执行任何其他操作。< / p>

n=0
for current in "${files[@]}"; do
    n=((n+1))
    printf '%s %s\n' "$n" "$current"
done

如果你不需要它用于其他目的,你甚至不需要将它存储在中间的数组中:

for current in *; do

工作得很好

答案 1 :(得分:1)

请参阅为什么not parse output of ls,而是使用process-substitution (<()).正确的while循环

#!/bin/bash

while IFS= read -r -d '' file
do
    printf "%s\n" "${file#*/}" 
done < <(find . -maxdepth 1 -mindepth 1 -type f -print0)

(或)如果您有兴趣将文件夹内容存储在数组中

fileContents=()
while IFS= read -r -d '' file
do
    fileContents+=("${file#*/}") 
done < <(find . -maxdepth 1 -mindepth 1 -type f -print0)

printf "%s\n" "${fileContents[@]}"