我正在尝试将文件列表存储到一个数组中,然后再次遍历该数组。
下面是我从控制台运行ls -ls
命令时得到的结果。
total 40
36 -rwxrwxr-x 1 amit amit 36720 2012-03-31 12:19 1.txt
4 -rwxrwxr-x 1 amit amit 1318 2012-03-31 14:49 2.txt
我编写了以下bash脚本,用于将上述数据存储到bash数组中。
i=0
ls -ls | while read line
do
array[ $i ]="$line"
(( i++ ))
done
但是当我echo $array
时,我什么都没得到!
仅供参考,我以这种方式运行脚本:./bashscript.sh
答案 0 :(得分:84)
答案 1 :(得分:31)
尝试:
#! /bin/bash
i=0
while read line
do
array[ $i ]="$line"
(( i++ ))
done < <(ls -ls)
echo ${array[1]}
在您的版本中,while
在子shell中运行,您在循环中修改的环境变量在其外部不可见。
(请注意,解析ls
的输出通常为not a good idea at all。)
答案 2 :(得分:5)
这是一个变体,它允许您使用正则表达式模式进行初始过滤,更改正则表达式以获得所需的过滤。
files=($(find -E . -type f -regex "^.*$"))
for item in ${files[*]}
do
printf " %s\n" $item
done
答案 3 :(得分:4)
这可能对您有用:
OIFS=$IFS; IFS=$'\n'; array=($(ls -ls)); IFS=$OIFS; echo "${array[1]}"
答案 4 :(得分:1)
在$(...)
中运行任何shell命令将有助于将输出存储在变量中。因此,我们可以使用IFS
将文件转换为数组。
IFS=' ' read -r -a array <<< $(ls /path/to/dir)
答案 5 :(得分:-1)
您可能想使用 (*)
但如果目录包含 *
字符怎么办?正确处理文件名中的特殊字符非常困难。
您可以使用 ls -ls
。但是,它无法处理换行符。
# Store la -ls as an array
readarray -t files <<< $(ls -ls)
for (( i=1; i<${#files[@]}; i++ ))
{
# Convert current line to an array
line=(${files[$i]})
# Get the filename, joining it together any spaces
fileName=${line[@]:9}
echo $fileName
}
如果您只需要文件名,那么只需使用 ls
:
for fileName in $(ls); do
echo $fileName
done