for k in {0..49};
do
a=$(($((2*$k))+1));
echo $a;
done
こんにちは、3行目の単純化された表現が必要です。おそらく、コマンド置換を使用しない表現が必要になるでしょう。
ベストアンサー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
ループ内で数回生成すると非常に遅くなります。はい、この問題は他のさまざまな方法で解決できますが、退屈です...