Bash는 for 루프에서 첫 번째 문자를 삭제합니다.

Bash는 for 루프에서 첫 번째 문자를 삭제합니다.

다음 코드 조각이 있습니다.

#!/bin/bash
IFS='\r\n'
vconsole="pts"
for entry in $(last -n 10)
do
        if [ -z $entry ]
        then
                continue
        fi
        if [ "$( echo $entry | grep -o 'pts')" == "$vconsole" ]
        then
                echo $entry
        fi
done

실행하면 다음과 같은 결과를 얻습니다.

oot     pts/0        85.XXX.XXX.138   F
oot     pts/0        85.XXX.XXX.138   Mo
oot     pts/1        85.XXX.XXX.138   Tue Ja
oot     pts/0        85.XXX.XXX.138   Tue Ja

나는 다음과 같은 것을 기대하고 있습니다 :

root     pts/0        85.XXX.XXX.138   Fri Jan 15 11:19   still logged in
root     pts/0        85.XXX.XXX.138   Mon Jan 11 10:12 - 10:43  (00:31)
root     pts/1        85.XXX.XXX.138   Tue Jan  5 14:30 - 14:39  (00:08)
root     pts/0        85.XXX.XXX.138   Tue Jan  5 13:29 - 14:39  (01:10)

첫 번째 캐릭터가 잘린 이유는 무엇입니까? 그리고 왜 결말이 무작위로 보일까요?

나는 이것을 실행하고있다centos-release-7-9.2009.1.el7.centos.x86_64

답변1

IFS='\r\n'

"root"와 "Fri"에 있는 것과 "Mon"과 "Jan"에 있는 것이 구분 기호 역할을 하도록 설정 IFS됩니다 . 백슬래시를 실제 제어 문자 CR 및 LR로 이스케이프하는 ANSI C 인용을 사용하려고 합니다 . 즉, 다음과 같습니다.<backslash><letter r><backslash><letter n>rn$'...'

IFS=$'\r\n'

다음을 사용할 수도 있습니다.

if [[ $entry = *pts* ]]; then...

문자열을 찾고 해당 문자열 및 이 사용자 이름의 일부인 echo | grep필드와도 일치합니다 .pts

이를 방지하려면 다음을 수행할 수 있습니다.

#!/bin/bash
last -n 10 | while read -r line; do
    read -r  user term whatever <<< "$line"
    if [[ $term = *pts* ]]; then
        echo "$line"
    fi
done

관련 정보