Bash multiplication and addition

AVS*_*AVS 35 scripting bash command-substitution

for k in {0..49};
do
a=$(($((2*$k))+1));
echo $a;
done
Run Code Online (Sandbox Code Playgroud)

Hi, I need a simplified expression for the third line, maybe one that does not use command substitution.

Kus*_*nda 45

使用算术扩展:

for (( k = 0; k < 50; ++k )); do
  a=$(( 2*k + 1 ))
  echo "$a"
done
Run Code Online (Sandbox Code Playgroud)

使用过时的expr实用程序:

for (( k = 0; k < 50; ++k )); do
  a=$( expr 2 '*' "$k" + 1 )
  echo "$a"
done
Run Code Online (Sandbox Code Playgroud)

使用bc -l-l在这种情况下实际上不需要,因为没有使用数学函数):

for (( k = 0; k < 50; ++k )); do
  a=$( bc -l <<<"2*$k + 1" )
  echo "$a"
done
Run Code Online (Sandbox Code Playgroud)

使用bc -l作为共同加工的(它就像在background¹一种计算服务的):

coproc bc -l

for (( k = 0; k < 50; ++k )); do
  printf "2*%d + 1\n" "$k" >&${COPROC[1]}
  read -u "${COPROC[0]}" a
  echo "$a"
done

kill "$COPROC_PID"
Run Code Online (Sandbox Code Playgroud)

最后一个看起来(可以说)更干净ksh93

bc -l |&
bc_pid="$!"

for (( k = 0; k < 50; ++k )); do
  print -p "2*$k + 1"
  read -p a
  print "$a"
done

kill "$bc_pid"
Run Code Online (Sandbox Code Playgroud)

¹ 这为我解决了一个问题,我需要在循环中处理大量输入。处理需要一些浮点计算,但bc在循环中生成几次被证明是非常慢的。是的,我可以用很多其他方式解决它,但我很无聊......


Jef*_*ler 15

您可以简化:

a=$(($((2*$k))+1));
Run Code Online (Sandbox Code Playgroud)

到:

a=$((2*k+1))
Run Code Online (Sandbox Code Playgroud)


Ste*_*ris 5

您可以使用该let命令强制进行计算。

let a="2*k+1"
Run Code Online (Sandbox Code Playgroud)

请注意,我们不需要$k在这个结构中;一个简单的k将完成这项工作。

  • 如果当前目录中有一个名为 `a=2whateverk+1` 的文件,则失败。更糟糕的是,如果有一个名为 `a=2+b[$(reboot)]k+1` 的文件,就会调用 `reboot` 命令。最好在这里使用 `((...))` (`((a = 2 * k + 1))`),或者使用 POSIX 语法:`a=$((2 * k + 1))` (5认同)