Bash 3.2 的逻辑或 || 行为 算术表达式中的运算符

Joe*_*ith 5 bash

我在最新的 mac 操作系统上使用 shell 脚本“a.sh”进行了实验,其中包含以下内容(精确副本)。

#!/bin/bash
echo $BASH_VERSION
a=0
(( a < 100 || 1 / a < 2 )) && echo ok
Run Code Online (Sandbox Code Playgroud)

我有:

3.2.57(1)-release
./a.sh: line 4: ((: a < 100 || 1 / a < 2 : division by 0 (error token is "< 2 ")
Run Code Online (Sandbox Code Playgroud)

既然a < 100已经是事实了,我想1 / a < 2就不会评价了。

有人可以帮助我理解这一点吗?

Léa*_*ris 6

有两种情况会出现此错误:

\n
    \n
  1. orBash 3.2.57 计算算术表达式中逻辑的两边。

    \n
  2. \n
  3. 或者因为您使用了单个|按位 \xe2\x88\xa8,而不是双||逻辑 \xe2\x88\xa8 布尔表达式运算符:

    \n
  4. \n
\n
LC_ALL=C bash -c \'a=0; (( a < 100 | 1 / a < 2 )) && echo ok\'\n
Run Code Online (Sandbox Code Playgroud)\n
\n

bash: ((: a < 100 | 1 / a < 2 : division by 0 (error token is "a < 2 ")

\n
\n
LC_ALL=C bash -c \'a=0; (( a < 100 || 1 / a < 2 )) && echo ok\'\n
Run Code Online (Sandbox Code Playgroud)\n
\n

ok

\n
\n

原因:\n|是按位运算符or

\n

当用作:

\n

a < 100 | 1 / a < 2,

\n

按位or应用如下:

\n

100 | 1,

\n

二进制中的女巫相当于01100100 \xe2\x88\xa8 00000001\xe2\x86\x9201100101二进制或101以 10 为基数。

\n

最后:

\n

a < 100 | 1 / a < 2原来是:

\n

a < 101 / a < 2

\n

什么时候a=0

\n

0 < 101 / 0 < 2

\n