for k in {0..49};
do
a=$(($((2*$k))+1));
echo $a;
done
你好,我需要第三行的简化表达式,也许是不使用命令替换的表达式。
答案1
使用算术展开式:
for (( k = 0; k < 50; ++k )); do
a=$(( 2*k + 1 ))
echo "$a"
done
使用过时的expr
实用程序:
for (( k = 0; k < 50; ++k )); do
a=$( expr 2 '*' "$k" + 1 )
echo "$a"
done
使用bc -l
(-l
在这种情况下实际上不需要,因为没有使用数学函数):
for (( k = 0; k < 50; ++k )); do
a=$( bc -l <<<"2*$k + 1" )
echo "$a"
done
用bc -l
作协进程(它的作用类似于后台的一种计算服务):
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"
最后一个看起来(可以说)更干净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"
1 这曾经为我解决了一个问题,我需要在循环中处理大量输入。该处理需要一些浮点计算,但bc
在循环中生成几次被证明非常慢。是的,我可以用很多其他方式解决这个问题,但我很无聊......
答案2
您可以简化:
a=$(($((2*$k))+1));
到:
a=$((2*k+1))
答案3
您可以使用该let
命令强制计算。
let a="2*k+1"
请注意,我们不需要$k
在此结构中;一个简单的k
就可以完成工作。
答案4
您可能需要的算术扩展是这样的:
a=$(( 1+2*k ))
事实上,你不需要使用变量:
for k in {0..49}; do
echo "$(( 1 + 2*k ))"
done
或者可以将计数变量移动到for ((…))
循环中:
for (( k=0;k<50;k++ )); do
a=$(( 1+2*k ))
printf '%s\n' "$a"
done
for ((…)) 循环
并且,在这种情况下,算术扩展也可以移至 for 循环内部:
for (( k=0 ; a=1+2*k , k<50 ; k++)); do
printf '%s\n' "$a"
done
或者,获取数组中的所有值:
for (( k=0 ; a[k]=1+2*k , k<49 ; k++ )); do :; done
printf '%s\n' "${a[@]}"
没有公式
但避免任何算术扩展的最短方法可能是将变量递增两次:
for (( k=0,a=1 ; k<50 ; k++,a++,a++ )); do
printf '%s\n' "$a"
done
或者,更简单,只需使用 seq:
seq 1 2 100