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)
您可以使用该let命令强制进行计算。
let a="2*k+1"
Run Code Online (Sandbox Code Playgroud)
请注意,我们不需要$k在这个结构中;一个简单的k将完成这项工作。