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