문제 - ksh 스크립트에서 while 무한 루프 사용

문제 - ksh 스크립트에서 while 무한 루프 사용

저는 직장에서 몇 가지 검사를 자동화하기 위한 스크립트를 작성하고 있는데, 오랫동안 지속되어 온 한 가지 문제 때문에 어려움을 겪고 있습니다. 바로 스크립트가 끝나지 않는다는 것입니다.

모든 작업을 반복해서 완료합니다. 2개의 while 루프가 있습니다. 첫 번째 루프가 완료되면 논리적으로 두 번째 루프가 시작됩니다. 두 번째 작업이 완료되면 첫 번째 작업부터 다시 시작됩니다.

또한 두 루프가 차례로 완료된 후에 종료되기를 원합니다. 나는 스크립트를 자주 작성하지 않으며 대답은 아마도 간단할 것입니다. 그러나 지금까지 내 스크립트에 적합한 스크립트를 찾을 수 없습니다.

당신의 도움을 주셔서 감사합니다.

스크립트 아래:

#!/bin/ksh
#
#
#
#
day=`date +%Y%m%d`
BASEDIR=$(dirname $(readlink -f $0))
cd $BASEDIR

cd /export/home/prodwww/ftp_backup/conf
grep "mds_lin_m" *|cut -d " " -f1 > /export/home/prodwww/Production/Check/tmp/mono_list_"$day".log

cat /export/home/prodwww/Production/Check/tmp/mono_list_"$day".log |cut -d "    " -f1 > /export/home/prodwww/Production/Check/log/mono_list_"$day"_.log
sed -i -e "s/:/\//g" /export/home/prodwww/Production/Check/log/mono_list_"$day"_.log

cat /export/home/prodwww/Production/Check/log/mono_list_'date'_.log |while read lines
do
grep -HL 'NbChannel' /export/home/prodwww/ftp_backup/data/"$lines"/mds.ini >>  /export/home/prodwww/Production/Check/log/result_"$day"_.log;
done

cat  /export/home/prodwww/Production/Check/log/result_"$day"_.log|cut -d"/" -f 7-8>  /export/home/prodwww/Production/Check/log/autoswitch-list.log
sed -i -e "s/\// @ /g" /export/home/prodwww/Production/Check/log/autoswitch-list.log

awk -F" " '{print $3 $2 $1}' /export/home/prodwww/Production/Check/log/autoswitch-list.log > /export/home/prodwww/Production/Check/log/check-list.log
        cat  /export/home/prodwww/Production/Check/log/check-list.log |while read target
do
echo "$target">/export/home/prodwww/Production/Check/log/account.txt

cat /export/home/prodwww/Production/Check/log/account.txt|cut -d"@" -f1>/export/home/prodwww/Production/Check/log/login.txt
logon=$(cat /export/home/prodwww/Production/Check/log/login.txt)
echo $target>>/export/home/prodwww/Production/Check/data/autoswitch_check_"$day".log ;  /usr/local/bin/rww CMD "$target" "ls -lrt /export/home/"$logon"/mds/conf/autoswitch.ini">> /export/home/prodwww/Production/Check/data/autoswitch_check_"$day".log

done
exit

답변1

루프가 "무한"이 되는 명확한 이유는 없습니다. 그러나 똑같은 스크립트를 다시 작성하고 각 파일 이름을 변수로 추출하면 더 깔끔한 버전인 IMO가 제공됩니다.

day=`date +%Y%m%d`
BASEDIR=$(dirname $(readlink -f $0))
cd $BASEDIR


dir1="/export/home/prodwww/ftp_backup/conf"
log1="/export/home/prodwww/Production/Check/tmp/mono_list_$day.log"
log2="/export/home/prodwww/Production/Check/log/mono_list_$day_.log"
log3="/export/home/prodwww/Production/Check/log/mono_list_date_.log"
ini1="/export/home/prodwww/ftp_backup/data/$lines/mds.ini"
log4="/export/home/prodwww/Production/Check/log/result_$day_.log"
log5="/export/home/prodwww/Production/Check/log/autoswitch-list.log"
log6="/export/home/prodwww/Production/Check/log/check-list.log"
txt1="/export/home/prodwww/Production/Check/log/account.txt"
txt2="/export/home/prodwww/Production/Check/log/login.txt"
log7="/export/home/prodwww/Production/Check/data/autoswitch_check_$day.log" 
ini2="/export/home/$logon/mds/conf/autoswitch.ini"
log8="/export/home/prodwww/Production/Check/data/autoswitch_check_$day.log"



cd "$dir1"
grep "mds_lin_m" * | cut -d " " -f1 >"$log1"

cat "$log1" | cut -d "    " -f1 >"$log2"
sed -i -e "s/:/\//g" "$log2"

cat "$log3"| while read lines
do
    grep -HL 'NbChannel' "$ini1" >> "$log4"
done

cat  "$log4" | cut -d"/" -f 7-8 > "$log5"
sed -i -e "s/\// @ /g" "$log5"

awk -F" " '{print $3 $2 $1}'  "$log5"> "$log6"
cat  "$log6" | while read target
do
    echo "$target" > "$txt1"

    cat "$txt1" | cut -d"@" -f1 > "$txt2" 
    logon=$( cat "$txt2" )
    echo $target >> "$log7";
    /usr/local/bin/rww CMD "$target" "ls -lrt $ini2" >> "$log7" 

done
exit

grep -HL 'NbChannel' "$ini1" >> "$log4"그런 다음 log3분명히 log4.

아마도 이것은 당신이 원하는 것이 아닐 수도 있습니다. 이것이 바로 다음 명령이 모두 에서 동일한 값에 대해 반복해서 반복되는 이유입니다 log4.

첫 번째 공간에서 잘리기 때문에 log2항상 비어 있어야 합니다 . log1그러면 log1공백이 없을 것입니다. 무엇이든 일치하는 것은 불가능합니다 cut -d " " -f1.

관련 정보