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

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

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

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

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

<myusername> <myusername> <myusername>

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

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

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


person michjnich    schedule 16.04.2018    source источник
comment
read -a присваивает значения в массиве own. Используя ${own[@]}, вы получаете все элементы массива в одной строке. Это правильное поведение... Чего именно вы ожидаете?   -  person oliv    schedule 16.04.2018
comment
@oliv Я предполагаю, что неправильно понял, чего мне следует ожидать. Я хочу, чтобы значения читались по одному, а не все за один раз. Цикл возвращает только одно значение, которое содержит все 3 значения, а не возвращает 3 значения. т.е. цикл обрабатывается только один раз, а не 3 раза, как я хочу.   -  person michjnich    schedule 16.04.2018


Ответы (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, потому что вы получаете все в одной строке.

person oliv    schedule 16.04.2018
comment
Я начал с этого, но результат тот же: $ while read -r own; сделать эхо ${собственный}:; done ‹‹‹ вот я, качайте меня, как ураган ===› вот я, качайте меня, как ураган: - person michjnich; 16.04.2018
comment
Точнее, просто чтобы прояснить количество итераций: while read -r own; сделать ((кт++)); эхо ${собственный}:${ct}; сделано ‹‹‹ я здесь ====› я здесь:1 - person michjnich; 16.04.2018
comment
Ответ @urbanespaceman обновлен, но манипуляции со строками в чистом bash могут привести к проблемам. Если бы вы подробнее описали, что вы хотите сделать с результатом stat, вполне вероятно, что инструмент обработки текста, такой как sed или awk, справился бы с этой задачей лучше. - person oliv; 16.04.2018
comment
Это делает это! Спасибо @oliv. Он всегда предназначен для чтения не более 6 файлов и будет возвращать статус ошибки, если найдет файлы, не принадлежащие текущему пользователю (т. е. он будет сравнивать ${own[@]} с $(whoami ) и выйдите из 1, если они не совпадают) - person michjnich; 16.04.2018