почему это для l oop только l oop один раз? - PullRequest
0 голосов
/ 28 мая 2020

то, что я пытаюсь сделать, - это простой практический код с таким выводом:

user1 logged in at hh:mm
user2 logged in at hh:mm
...

, поэтому я написал basi c для l oop, но то, что я не делаю понять, почему он запускается только один раз.

for user in $(who)
do
    USERID=$(echo $user | tr -s ' ' | cut -d' ' -f1)
    LOGTIME=$(echo $user | tr -s ' '| cut -d' ' -f4)
    echo "$USERID logged in at $LOGTIME"
done

это перекликается со следующим:

user1
user2
user3 logged in at hh:mm
hh:mm
hh:mm

Я поместил эхо-строки между ними, чтобы выяснить, что происходит и как это исправить , но единственное, что я понял, это то, что for l oop запускается только один раз, поэтому USERID и LOGTIME - это просто длинная строка с разрывами строк. Что я делаю не так? (я сделал IFS = $ '\ n')

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Не могли бы вы попробовать следующее:

while read -r user tty mon day logtime; do
    echo "$user logged in at $logtime"
done < <(who)
0 голосов
/ 28 мая 2020
#!/bin/sh

who > stack

while [ $(wc -l stack) -gt 0 ]
do
  line=$(sed '1p' stack)
  USERID=$(echo ${line} | tr -s ' ' | cut -d' ' -f1)
  LOGTIME=$(echo ${line} | tr -s ' '| cut -d' ' -f4)
  echo "${USERID} logged in at ${LOGTIME}"
  sed -i '1d' stack
done

rm -v ./stack
exit 0

Если это не сработает, предоставьте мне пример того, кто выводит данные на вашем компьютере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...