Почему функция длины массива в Bash выводит 1? - PullRequest
0 голосов
/ 27 февраля 2020

я удивляюсь, почему я получаю длину 1, возвращаемую каждый раз, даже если $ test пуст, хотя grep ничего не может найти.

#!/bin/bash

set -Eeuo pipefail
set -x

declare -a test

test=$(echo "$outputOfOtherCommand" | grep -i '>f\+\+\+\+\+\+\+\+\+' | cut -d' ' -f2) || true
echo "${#test[@]}"

for t in $test
do
    echo $t
done

Команда $ outputOfOtherCommand включает вывод команды Rsyn c. Файл test_new_file был создан только для ясности.

➜  ~ ./script.sh
.d..t...... ./
>f+++++++++ test_new_file

Number of files: 10 (reg: 9, dir: 1)
Number of created files: 1 (reg: 1)
Number of deleted files: 0
Number of regular files transferred: 1
Total file size: 0 bytes
Total transferred file size: 0 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 280
Total bytes received: 38

Единственное, что я могу объяснить, это то, что пустая запись была создана в позиции массива 0. Но я не знаю. Может быть, вы можете мне помочь.

1 Ответ

0 голосов
/ 27 февраля 2020

test - это массив только потому, что вы объявили его, используя -a. Присвоение вида

test=$(.....) 

назначает одну строку для test, которая заканчивается в элементе массива с индексом 0. Следовательно, длина вашего массива равна 1.

You можете проверить это по

declare -a arr
arr=$(echo a b c)
echo ${arr[0]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...