Если вывод вашего last
выглядит следующим образом:
username pts/2 1.2.3.4 via Sun Sep 2 06:40 - 06:40 (00:00)
и вы хотите добавить символы новой строки там, где они были изначально, то я предлагаю немного изменить логику.Сначала прочитать входную строку -по строке -, и только после этого разбить строку на слова. Таким образом, нет необходимости явно искать скобки. И вы можете повторить весь цикл, обернув его внутри while true; do... done
. Итак, у нас есть что-то вроде этого:
#!/bin/bash
set -f
while true; do
last | while IFS= read -r line; do
for word in $line; do
sleep.1
printf "%s " "$word"
done
echo # prints a newline
done
done
set -f
отключает расширение имени файла, которое в противном случае могло бы произойти при расширении $line
без кавычек. Кроме того, я бы использовал printf
вместо echo для печати слов по ряду причин.
Если вы явно хотите искать закрывающую скобку, вы можете использовать [[.. ]]
тест, :который позволяет сопоставлять шаблоны с шаблонами -, такими как шаблоны, или с регулярными выражениями.([[ $word =~ $re ]]
будет соответствовать регулярному выражению)
#!/bin/bash
set -f
while true; do
for word in $(last); do
sleep.1
printf "%s " "$word"
[[ $word = *')'* ]] && echo
done
done
Хотя этот, конечно, не добавляет новую строку в строки, где окончательная продолжительность входа в систему заменена чем-то вроде still logged in
.
У конструкции for word in $whatever
есть недостаток, заключающийся в том, что она обрабатывает несколько пробелов точно так же, как одиночные пробелы, поэтому в выводе скрипта столбцы не будут выровнены так аккуратно, как в оригинале.
У вас слишком много знаков равенства :должно быть GROUP="video"
, а не GROUP=="video"
.