你能解释一下 bash shell 中的数学语法吗?

Don*_*van 4 math bash for-loop

for i in {1..99}
do
  if ([ $((i % 2)) -eq 1 ])
  then
      echo $i
  fi
done
Run Code Online (Sandbox Code Playgroud)

我正在学习 bash,我正在努力更好地理解第 3 行。为什么$((i % 2))必须用括号括起来,为什么我不能将$符号放在i类似的旁边:

([ (($i % 2)) -eq 1 ])
Run Code Online (Sandbox Code Playgroud)

或者

([ ($(i % 2)) -eq 1 ])
Run Code Online (Sandbox Code Playgroud)

?

che*_*ner 5

里面的所有内容都$((...))被视为算术表达式。您可以在算术表达式中使用参数扩展,但将裸字符串解释为使用其(整数)值的变量。你可以写

if [ $(( i % 2 )) -eq 1 ]
Run Code Online (Sandbox Code Playgroud)

检查是否i奇怪。您还可以检查表达式中的相等性,$(( x == y ))如果为 1,则为x == y0,否则为0,但您仍然需要将该值与某个值进行比较。

在 中bash,您可以使用算术命令,如果结果值不为零,则退出状态为 0,否则为 1。这让你写

if (( i % 2 == 1 )); then
Run Code Online (Sandbox Code Playgroud)

  • 好吧,你*可以*使用 `(( $i % 2 ))`,但它是一个命令,而不是一个表达式。两者只是在不同的上下文中使用。 (2认同)

Bar*_*mar 5

$(( expression ))是用于计算算术表达式并用该表达式的结果替换此语法的语法。它记录在 Bash 手册

此处描述了算术表达式的语法。在变量名之前放置$是可选的,因此您也可以将其写为$(($i % 2)).

您必须将其括在两个括号中,因为$(...)它已经具有含义,它用于命令替换$(some command)执行some command,然后替换为命令的输出。

您不需要将 括起来[ ... ]。撰写if声明的正常方式是

if [ $((i % 2)) -eq 1 ]
Run Code Online (Sandbox Code Playgroud)

您也可以将其写为

if (( i % 2 == 1 ))
Run Code Online (Sandbox Code Playgroud)

(( expression ))计算算术表达式,然后根据结果是零还是非零设置其退出状态。