私は職場でいくつかのテストを自動化するためのスクリプトを書いていますが、長い間持続してきた問題の1つに苦しんでいます。まさにスクリプトが終わらないということです。
すべての操作を繰り返し完了します。 2つのwhileループがあります。最初のループが完了すると、論理的に2番目のループが始まります。 2回目のジョブが完了すると、1回目のジョブから再開されます。
また、両方のループが順番に完了した後に終了したいと思います。私はスクリプトを頻繁に書かず、答えはおそらく簡単です。しかし、これまで私のスクリプトに適したスクリプトが見つかりませんでした。
ご協力ありがとうございます。
スクリプトの下:
#!/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
。