bash:将列表文件放入变量中,但数组大小为1

时间:2013-03-05 13:04:59

标签: linux bash shell unix

我将文件列在目录中并循环浏览它们,但我需要知道它们有多少。 $ {#dirlist [@]}总是1,但for循环有效吗?

#!/bin/bash
prefix="xxx"; # as example

len=${#prefix}; # string length
dirlist=`ls ${prefix}*.text`;
qty=${#dirlist[@]};  # sizeof array is always 1
for filelist in $dirlist
do
    substring="${filelist:$len:-5}";
    echo "${substring}/${qty}";
done

我有xxx001.text文件到xxx013.text
但我得到的只是001/1 002/1 003/1

5 个答案:

答案 0 :(得分:24)

dirlist=`ls ${prefix}*.text`

不创建数组,它只是一个空格分隔文件名的字符串。

你必须这样做

dirlist=(`ls ${prefix}*.text`)

使它成为一个数组。

然后$ dirlist将仅引用第一个元素,你必须使用

${dirlist[*]}

在循环中引用所有这些。

答案 1 :(得分:3)

除非您使用( )包围数组,否则您不会创建数组:

dirlist=(`ls ${prefix}*.text`)

答案 2 :(得分:2)

dir=/tmp
file_count=`ls -B "$dir" | wc -l`
echo File count: $file_count

答案 3 :(得分:1)

arr=(~/myDir/*)

使用计数器

遍历数组
for ((i=0; i<${#arr[@]}; i++)); do
#do something to each element of array


 echo "${arr[$i]}"
done

答案 4 :(得分:0)

bash 中的 array 语法很简单,使用括号 ()

# string
var=name

# NOT array of 3 elements
# delimiter is space ' ' not ,
arr=(one,two,three) 
echo ${#arr[@]}
1

# with space
arr=(one two three)
# or ' ',
arr=(one, two, three)
echo ${#arr[@]}
3

# brace expansion works as well
# 10 elements
arr=({0..9})
echo ${#arr[@]}
10

# advanced one
curly_flags=(--{ftp,ssl,dns,http,email,fc,fmp,fr,fl,dc,domain,help});
echo ${curly_flags[@]}
--ftp --ssl --dns --http --email --fc --fmp --fr --fl --dc --domain --help
echo ${#curly_flags[@]}
12

如果你想运行一个命令并存储输出

# a string of output
arr=$(ls)
echo ${#arr[@]}
1

# wrapping with parentheses
arr=($(ls))
echo ${#arr[@]}
256

更高级/更方便的方法是使用内置 bash 命令mapfilereadarray进程替换。这是使用 mapfile 的示例:

# read the output of ls, save it in the array name: my_arr
# -t    Remove a trailing DELIM from each line read (default newline)
mapfile -t my_arr < <(ls)
echo ${#my_arr[@]}
256