내 상태에 뭔가 문제가 있는 것 같아

내 상태에 뭔가 문제가 있는 것 같아

현재 줄에 다음 정규식이 있는 경우 현재 줄과 이전 줄을 인쇄한다는 조건으로 파일을 읽으려고 합니다. 하지만 전혀 출력이 나오지 않습니다.

$ cat xc
#!/bin/bash
prev=
regex="switchport trunk allowed vlan*"
while read line
do
    if [ -n "${prev}" ] && [[ $line =~ $regex ]];then
        line1="${prev}"
        line2="${line}"
        echo "${line1}"
        echo "${line2}"
    fi
done < as159.tmp

$ ./xc

$prev 부분 없이 조건을 테스트할 때(아래 표시된 대로 주석 처리함) 출력이 나오는 것을 볼 수 있습니다.

$ cat xc
#!/bin/bash
prev=
regex="switchport trunk allowed vlan*"
while read line
do
    #if [ -n  "${prev}" ] && 
    if [[ $line =~ $regex ]];then
        line1="${prev}"
        line2="${line}"
        echo "${line1}"
        echo "${line2}"
    fi
done < as159.tmp


$ ./xc

switchport trunk allowed vlan 40,10,30

switchport trunk allowed vlan 10,20,30,50,100

따라서 이것은 확실히 상태 문제입니다. 그것이 무엇인지 잘 모르겠습니다.

답변1

주요 문제는 변수에 관한 것입니다. prev이 변수에는 값이 없기 때문입니다. 따라서 해결책은 다음과 같은 값을 할당하는 것입니다.

...
while read line
do
    #if [ -n  "${prev}" ] && 
    if [[ $line =~ $regex ]];then
        line1="${prev}"
        line2="${line}"
        echo "${line1}"
        echo "${line2}"
    fi
prev="$line"
done < as159.tmp
...

BTW, line1="${prev}"and 사용은 line2="${line}"중복됩니다(원래 변수에 영향을 주지 않고 값을 조작하려는 경우 제외). 따라서 간단히 다음을 사용할 수 있습니다.

...
while read line
do
    #if [ -n  "${prev}" ] && 
    if [[ $line =~ $regex ]];then
        echo "${prev}"
        echo "${line}"
    fi
prev="$line"
done < as159.tmp
...

관련 정보