在 UNIX shell 脚本中为每 'n' 次执行引入等待时间
Introducing wait time in UNIX shell script for every 'n' executions
我有 2 个文件:file.dat 和 mapping.dat.
file.dat 包含条目(可以包含重复项),而 mapping.dat 是一个静态文件,其中包含条目及其相应的 session/job 名称,用逗号分隔。
我开发了一个简单的 UNIX Shell 脚本,它循环运行 file.dat 中的每个条目,它在 mapping.dat 中搜索 session/job 名称并显示输出。
file.dat
的内容
ekm
ckm
cnc
cnx
ekm
hnm
dam
mapping.dat
的内容
#Entry,Job_Name#
ckm,BDSCKM
cnc,BDSCNC
cnx,BDSCNX
ekm,BDSEKM
azm,BDSAZM
bam,BDSBAM
cam,BDSCAM
oid,BDSOID
hnm,BDSHNM
dam,BDSDAM
当前脚本:
#!/bin/ksh
for FILE in `cat file.dat`
do
SESSION=`grep $FILE mapping.dat | cut -d, -f2`
echo "For ${FILE}, Session launched is: ${SESSION} "
done
当前输出
For ekm, Session launched is: BDSEKM
For ckm, Session launched is: BDSCKM
For cnc, Session launched is: BDSCNC
For cnx, Session launched is: BDSCNX
For ekm, Session launched is: BDSEKM
For hnm, Session launched is: BDSHNM
For dam, Session launched is: BDSDAM
我的问题是我想为每 2 次输出引入一个 wait/sleep 时间,即它应该首先显示
For ekm, Session launched is: BDSEKM
For ckm, Session launched is: BDSCKM
等待 90 秒,然后
For cnc, Session launched is: BDSCNC
For cnx, Session launched is: BDSCNX
..等等
尝试使用 modulo operator %
.
帮助自己
#!/bin/ksh
count=1
for file in $( cat file.dat )
do
session=$( grep $file mapping.dat | cut -d, -f2 )
echo "For ${file}, session launched is ${session}."
if (( count % 2 == 0 ))
then
sleep 90
fi
(( count++ ))
done
打印前 2 行,然后等待 90 秒,然后打印接下来的 2 行,依此类推。
按照 Tony Stark 的建议使用 %
模运算符。不需要初始化计数器。
#!/bin/bash
for file in $( cat file.dat )
do
session=$( grep $file mapping.dat | cut -d, -f2 )
echo "For ${file}, session launched is ${session}."
(( count++ % 2 )) && sleep 90
done
这是我的做法,我在消息中添加了无法识别的项目(您只需从 while read 循环的第一行删除 || session='UNRECOGNIZED'
即可安全地删除它)。我不太熟悉 ksh,但我相信 read
在这种情况下与 bash 相同(我对 bash 非常熟悉)。
我用你的示例数据进行了测试,它适用于 ksh
和 bash
。
#!/bin/ksh
# Print 2 mappings every 90 seconds
FILE="./file.dat"
MAP="./mapping.dat"
while IFS= read -r line; do
session=$(grep "$line" "$MAP") || session='UNRECOGNIZED'
echo "For $line, session launched is: ${session#*,}"
((count++ % 2)) && sleep 90
done < "$FILE"
我使用非贪婪的后缀删除 (#
) 来隔离 'session'。
我有 2 个文件:file.dat 和 mapping.dat.
file.dat 包含条目(可以包含重复项),而 mapping.dat 是一个静态文件,其中包含条目及其相应的 session/job 名称,用逗号分隔。 我开发了一个简单的 UNIX Shell 脚本,它循环运行 file.dat 中的每个条目,它在 mapping.dat 中搜索 session/job 名称并显示输出。
file.dat
的内容ekm
ckm
cnc
cnx
ekm
hnm
dam
mapping.dat
的内容#Entry,Job_Name#
ckm,BDSCKM
cnc,BDSCNC
cnx,BDSCNX
ekm,BDSEKM
azm,BDSAZM
bam,BDSBAM
cam,BDSCAM
oid,BDSOID
hnm,BDSHNM
dam,BDSDAM
当前脚本:
#!/bin/ksh
for FILE in `cat file.dat`
do
SESSION=`grep $FILE mapping.dat | cut -d, -f2`
echo "For ${FILE}, Session launched is: ${SESSION} "
done
当前输出
For ekm, Session launched is: BDSEKM
For ckm, Session launched is: BDSCKM
For cnc, Session launched is: BDSCNC
For cnx, Session launched is: BDSCNX
For ekm, Session launched is: BDSEKM
For hnm, Session launched is: BDSHNM
For dam, Session launched is: BDSDAM
我的问题是我想为每 2 次输出引入一个 wait/sleep 时间,即它应该首先显示
For ekm, Session launched is: BDSEKM
For ckm, Session launched is: BDSCKM
等待 90 秒,然后
For cnc, Session launched is: BDSCNC
For cnx, Session launched is: BDSCNX
..等等
尝试使用 modulo operator %
.
#!/bin/ksh
count=1
for file in $( cat file.dat )
do
session=$( grep $file mapping.dat | cut -d, -f2 )
echo "For ${file}, session launched is ${session}."
if (( count % 2 == 0 ))
then
sleep 90
fi
(( count++ ))
done
打印前 2 行,然后等待 90 秒,然后打印接下来的 2 行,依此类推。
按照 Tony Stark 的建议使用 %
模运算符。不需要初始化计数器。
#!/bin/bash
for file in $( cat file.dat )
do
session=$( grep $file mapping.dat | cut -d, -f2 )
echo "For ${file}, session launched is ${session}."
(( count++ % 2 )) && sleep 90
done
这是我的做法,我在消息中添加了无法识别的项目(您只需从 while read 循环的第一行删除 || session='UNRECOGNIZED'
即可安全地删除它)。我不太熟悉 ksh,但我相信 read
在这种情况下与 bash 相同(我对 bash 非常熟悉)。
我用你的示例数据进行了测试,它适用于 ksh
和 bash
。
#!/bin/ksh
# Print 2 mappings every 90 seconds
FILE="./file.dat"
MAP="./mapping.dat"
while IFS= read -r line; do
session=$(grep "$line" "$MAP") || session='UNRECOGNIZED'
echo "For $line, session launched is: ${session#*,}"
((count++ % 2)) && sleep 90
done < "$FILE"
我使用非贪婪的后缀删除 (#
) 来隔离 'session'。