Bash 函数具有奇怪的 AND 和 OR 结果

  • 本文关键字:AND OR 结果 函数 Bash bash
  • 更新时间 :
  • 英文 :


Function:

function executeTcpConnetions() {
    host=$1
    port=$2
    max=$3
    trues=0
    falses=0
    count=0
    while [ $count -lt $max ]
    do
            timeout 2 bash -c "</dev/tcp/$host/$port" && ((trues++)) || ((falses++));
            ((count++))
    done
    echo $trues $falses }

我看到如果你用 max=1 调用该函数,echo 将为真返回 1,为假返回 1。但是为什么在第一次迭代中两个 bash aritimetic 都被执行了呢?如果您提供 1000 或任何大于 1 的值,它将像我想象的那样工作。

这个想法是测试tcp连接,如果能够连接...如果是,请在 trues 中添加 1...如果否,则在 false 中添加 1。

(( expression ))

如果EXPRESSION计算结果为 0,则返回 1;否则返回 0。

如果使用后增量且变量等于 0,则表达式的计算结果将为 0,并将返回 1:

$ var=0
$ ((var++)) || echo failed
failed
$ var=10
$ ((var-10)) || echo failed
failed
$ var=-1
$ ((++var)) || echo failed
failed

您可以改用预递增:

$ var=0
$ ((++var)) && echo ok
ok

或者您可以使用if语句:

if timeout 2 bash -c "</dev/tcp/$host/$port"; then
    ((trues++))
else 
    ((falses++))
fi

我还建议查看 Bash 陷阱 #22 解释为什么cmd1 && cmd2 || cmd3不等于if ... then ... else ... fi .

最新更新