将 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
工作正常
我想将 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
工作正常