루프가 grep을 읽어 문자열을 찾는 동안 전체 파일을 읽지 않고 첫 번째 실패 시 종료합니다.

루프가 grep을 읽어 문자열을 찾는 동안 전체 파일을 읽지 않고 첫 번째 실패 시 종료합니다.

테이블 파일을 읽고 문자열을 찾는 스크립트가 있습니다. 문자열이 발견되면 발견된 줄을 구문 분석하고 일부 작업을 수행해야 합니다. 문자열이 처음 발견되지 않으면 스크립트가 종료됩니다. (파일의 첫 번째 줄.) 테이블 파일 형식은 다음과 같습니다.

10.1.1:0.0:lan:hq:3:254:br0:.1.16:.1.1:.1.21:.1.23:hq:eoc:hq

변수 정의($ip 및 $ipad)와 로깅 및 디버깅 기능은 while 루프 앞에 제공됩니다. 읽기 어려운 항목(디버깅, 로깅, 댓글 등)을 모두 추출했습니다. while 루프는 다음과 같습니다:

line=$(grep ${ipad} {$net})
    if [ -z ${line}]; then
    base=$(echo ${ip}|awk -F"." '{print $1"."$2}')
    mask=$(echo ${line}|awk -F":" '{print $2}')
    zone=$(echo ${line}|awk -F":" '{print $3}')
    loc=$(echo ${line}|awk -F":" '{print $4}')
    low=$(echo ${line}|awk -F":" '{print $5}')
    high=$(echo ${line}|awk -F":" '{print $6}')
    bri=$(echo ${line}|awk -F":" '{print $7}')
    bftp=$(echo ${line}|awk -F":" '{print $8}')
    ftp=${base}${bftp}
    bgate=$(echo ${line}|awk -F":" '{print $9}')
    gate=${base}${bgate}
    bns=$(echo ${line}|awk -F":" '{print $10}')
    bns1=$(echo ${line}|awk -F":" '{print $11}')
    if [[ ${loc} == "var1" && ${zone} == "var2" ]]; then 
        ns=10.10${bns}
        ns1=10.10${bns1}
    else
        ns=${base}${bns}
        ns1=${base}${bns1}
    fi
    if [[ ${loc} == "var3" && ${zone} == "var2" ]]; then
        ns=10.1${bns}
        ns1=10.1${bns1}
    else
        ns=${base}${bns}
        ns1=${base}${bns1}
    fi
    tld=$(echo ${line}|awk -F":" '{print $12}')
    tld1=$(echo ${line}|awk -F":" '{print $13}')
    com=$(echo ${line}|awk -F":" '{print $14}')
        if [ -f ${iptab} ]; then
            spc=$(cat ${iptab})
            tab=${zone}-${spc}.${loc}
        else
            tab=${zone}.${loc}
        fi
        # If no RAM size is given use 1GB
                if [ -z $ram ]; then
                        ram=1024
                fi
                # If no disk size is given use 10GB
                if [ -z $mem ]; then
                        mem=10
                fi
    #Then Do Some stuff with that info

    else
        log "IP address given does not match any of the IP Network blocks. Please check the address and try again."
        if [ -f ${korg} ]; then 
            mv ${korg} ${ksin}
        fi
        exit 0          
    fi

로그 출력에서 ​​while 루프가 첫 번째 줄에서 문자열을 찾지 못하고 종료되는 것을 볼 수 있습니다. 문자열의 첫 번째 줄이 포함된 스크립트에 매개 변수를 전달하면 while 루프는 모든 것을 실행한 다음 종료하지 않고 두 번째 줄을 시도합니다. 완전히 혼란스러워요.

답변1

루프 시작 부분에서 행에 일부 데이터가 포함되어 있는지 확인합니다.

if echo ${line}|grep ${ipad}; then

else이 지점은 if다음으로 시작합니다.

exit 0

이것이 스크립트가 중지되는 위치와 이유입니다.

관련 정보