在 UNIX shell 脚本中为每 'n' 次执行引入等待时间

Introducing wait time in UNIX shell script for every 'n' executions

我有 2 个文件:file.datmapping.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 非常熟悉)。

我用你的示例数据进行了测试,它适用于 kshbash

#!/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'。