Bashの乗算と加算

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

こんにちは、3行目の簡略化された式が必要です。コマンド置換を使用しないでください。

コメント

  • @Theophrastus:提案されているように、正常に機能しますが、(())の代わりにexprを使用したい場合はどうなりますか。
  • これはbashでありCではないため、すべての;-単行で記述しない限り。
  • 関連項目: unix.stackexchange.com/q/40786/117549
  • declare -i a; for k in {0..49}; do a=2*$k+1; echo $a; done
  • 余談ですが、$(( ... ))は、コマンド置換ではなく算術展開です。

回答

算術展開の使用:

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" 

最後のものは:

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" 

¹これにより、大量の入力を処理する必要があったときに問題が解決しました。ループ。処理にはいくつかの浮動小数点計算が必要でしたが、ループ内でbcを数回生成すると非常に遅いことがわかりました。はい、他の多くの方法で解決できたはずですが、退屈していました…

回答

簡単にできます。

a=$(($((2*$k))+1)); 

宛先:

a=$((2*k+1)) 

回答

letコマンドを使用して計算を強制できます。

let a="2*k+1" 

この構造では$kは必要ないことに注意してください。単純なkで十分です。

コメント

  • 現在のa=2whateverk+1というファイルが'ある場合は失敗しますさらに悪いことに、'というa=2+b[$(reboot)]k+1というファイルがある場合、rebootコマンドを呼び出します。 。ここでは((...))((a = 2 * k + 1)))を使用するか、POSIX構文を使用するのが最善です:a=$((2 * k + 1))
  • 引用できます; let a="2*k+1"それを解決します。

回答

おそらく必要な算術展開は次のとおりです:

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[@]}" 

式なし

ただし、算術展開を回避する最も短い方法は、変数を2回インクリメントすることです。

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

または、さらに簡単に、seqを使用します:

seq 1 2 100 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です