Чтение разделенной строкой пространства в массив в цикле while

Я хочу прочитать у владельца список файлов, затем сравнить его с текущим владельцем и вывести ошибку, если она не совпадает.

У меня есть следующее, где я заменил сравнение простым эхом для простоты, так как это не сравнение, которое идет не так:

while IFS=' ' read -ra own; do echo ${own[@]}; done <<< $(stat -c %U file*.*)

Статистика возвращает список строк (в данном случае 3 значения), все с моим именем пользователя в этом случае, но чтение только выводит его в виде одного чтения и строки.

<myusername> <myusername> <myusername>

Пояснение: я имею в виду, что цикл обрабатывается только один раз, возвращая строку со всеми 3 значениями, тогда как я хочу 3 итерации цикла, содержащие по одному значению в каждой.

Я изменил на IFS= и IFS='\t' на случай, если я каким-то образом неверно истолковал вывод stat, но я получаю то же самое поведение, даже если я просто определяю строку типа "Я здесь" вместо stat команда, поэтому я, очевидно, делаю что-то еще не так.

О, мне это тоже нужно в однострочном выражении, так что если это проблема, то, я думаю, я немного облажался.

1 ответ

Решение

Чтобы получить каждый элемент массива, вы можете перебрать переменную own с for цикл:

stat -c %U file*.* | { read -ra own; for i in ${own[@]}; do echo $i; done; }

Еще один способ сделать это:

{ read -ra own; for i in ${own[@]}; do echo $i; done; } <<< $(stat -c %U file*.*)

Обратите внимание, что вам не нужно while цикл, потому что вы получаете все на одной строке.

Другие вопросы по тегам