it-roy-ru.com

bash: поместите список файлов в переменную, но размер массива равен 1

Я перечисляю файлы в каталоге и перебираю их в порядке, НО мне нужно знать, сколько их тоже. $ {# dirlist [@]} всегда равен 1, но для цикла работает?

#!/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

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

не создает массив, он создает только строку с именами файлов, разделенными пробелами.

ты должен сделать

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

сделать это массивом.

Тогда $ dirlist будет ссылаться только на первый элемент, который вы должны использовать

${dirlist[*]}

ссылаться на все из них в цикле.

23
KarelSk

Вы не создадите массив, если не окружите его ():

dirlist=(`ls ${prefix}*.text`)
3
Costi Ciudatu
dir=/tmp
file_count=`ls -B "$dir" | wc -l`
echo File count: $file_count
2
Mikhail Vladimirov
arr=(~/myDir/*)

перебирать массив с помощью счетчика

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


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