バッシュ乗算と加算

バッシュ乗算と加算
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ループ内で数回生成すると非常に遅くなります。はい、この問題は他のさまざまな方法で解決できますが、退屈です...

答え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

あるいは、count変数を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[@]}"

公式なし

しかし、算術拡張を避ける最短の方法は、変数を2回増やすことです。

for (( k=0,a=1 ; k<50 ;  k++,a++,a++ )); do
    printf '%s\n' "$a"
done

またはもっと簡単にseqを使用してください。

seq 1 2 100

関連情報