我想将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值
答案 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[@]}"