将 ls 输出转换为数组

Convert ls Output Into an Array

我想将 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

它可以回显每个条目前面都有一个数字,但我不可能 select 从那里输入一个条目,因为每个值似乎都存储为 1 个值

看,为什么not parse output of ls, but rather use a proper while loop with process-substitution (<()).

#!/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[@]}"

如果你想在一个数组中获取这个目录中的所有文件,你可以使用 globbing:

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

会将与 glob 匹配的所有文件存储在数组 files 中,然后您可以根据需要使用 printf 打印它们,或者通过遍历数组做任何您想做的事情.

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

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

for current in *; do

工作正常