【问题标题】:sh executable if else statementsh 可执行 if else 语句
【发布时间】:2016-11-14 18:25:46
【问题描述】:

如果可执行文件输出某个字符串,我如何使用 sh 脚本进行测试?我使用./program 运行可执行文件,它会打印到控制台hellogoodbye。我想运行它 1000 次并计算每个输出出现的次数。

#!/bin/sh
count=0
secs=60                        # Set interval (duration) in seconds.
endTime=$(( $(date +%s) + secs )) # Calculate end time.

while [ $(date +%s) -lt $endTime ]; do  # Loop until interval has elapsed.
    if [[ ./program = *hello* ]]; then
        count++
    fi
done

编辑(根据给出的答案部分修复a):

#!/bin/sh


winCount=0
totalCount=0
secs=60                        # Set interval (duration) in seconds.
endTime=$(( $(date +%s) + secs )) # Calculate end time.

while [ $(date +%s) -lt $endTime ]; do  # Loop until interval has elapsed.
        totalCount++
        case $(./program) in
                *\[1\]\ \[1\]\ \[1\]* )((winCount++)) ;;
        esac
done
echo "wins=$winCount"
echo "total=$totalCount"

【问题讨论】:

  • 至少编辑您的 Q 以显示您建议如何运行程序 1000 次。祝你好运。
  • 真的需要运行一分钟,我只是想简化问题。我会用代码编辑。
  • ((totalCnt++)) 好吗? ;-) 祝你好运
  • 您的问题中edit: 部分的意义是什么?如果那是对@shelter 的回应,请添加备注以解释其存在的原因(或直接删除第一个副本)。

标签: if-statement sh counter executable


【解决方案1】:

编辑

试试

#!/bin/bash
runCount=0
secs=60                        # Set interval (duration) in seconds.
endTime=$(( $(date +%s) + secs )) # Calculate end time.

while [ $(date +%s) -lt $endTime ]; do  # Loop until interval has elapsed.
  # bash/ksh only ((runCount++))
  runCount=$(expr $runCount + 1 )
  case $(./program) in
      *\[1\]\ \[1\] ) ((matchCnt++)) ;;
  esac
done
echo "avg=$(( runCount / matchCnt ))"

原版

你很亲密。为什么不使用不受欢迎的case 语句,即。

#!/bin/sh
count=0
secs=60                        # Set interval (duration) in seconds.
endTime=$(( $(date +%s) + secs )) # Calculate end time.

while [ $(date +%s) -lt $endTime ]; do  # Loop until interval has elapsed.
  case $(./program) in
      *hello* )((helloCnt++)) ;;
      *goodbye* ) ((goodbyeCnt++)) ;;
  esac
done
echo "hellos=$helloCnt    goodByes=$goodbyCnt"

我想不出一个简单的替代 ./program,所以我无法测试这个。

如果您收到错误消息,请告诉我。

此外,如果您的目标是尽可能快地运行此程序,则使用循环计数器将消除对 $(date +%s) 的相对昂贵的调用来驱动您的循环。即

 for (i=0;i<1000;i++) ; do
     case $(./program) in
         ...
     esac
 done

IHTH

【讨论】:

  • 啊,还在学习编写一个可用的规范。好的 ;-) .. 让我做一些测试。我很确定我们可以逃脱[1]s。
  • 也避开空格字符,即\[1\]\ \[1\]
  • var++ 需要在$(( var++)) 内,或者如果var 只是被shell 计算使用,请留在(( var++ ))。请参阅我上面的 edit。祝你好运。
  • 你能切换到#!/bin/bash(或#!/bin/ksh)吗?
  • 我在++ 语法中进行了编辑,该语法适用于#!/bin/sh。做runCount=$(expr $runCount + 1)。肿瘤坏死因子。很高兴这有帮助。祝你好运