次のコードを使用してアームストロング番号を検出しようとしています。
declare -i INPUT=$1
arr=($(fold -w1 <<< "$INPUT"))
for index in "${!arr[@]}"
do
armstrong_sum+=$((${arr[index]}**${#arr[@]}))
done
echo "$armstrong_sum"
コードを実行するコマンド./armstrong_sum 9
:armstrong_sum 10
と./armstrong_sum 153
出力9
:10
と112527
期待される出力:9
と1
153
アームストロング数は、各桁数の合計を桁数で重ねた数です。
さらに重要なことは、スクリプトを直接デバッグできるようにしたいということです。 Bashでデバッグする方法がわかりません。オペランドの型を取得し、各ステップに対して一時停止された反復を表示するのと同じです。
ベストアンサー1
man bash
(強調)に規定されているように
整数属性が設定された変数に+ =を適用すると、値は算術式として評価され、変数の現在の値に追加され、この値も評価されます。 複合代入を使用して配列変数に+ =を適用すると(以下の配列を参照)、変数の値は設定解除されず(=が使用されている場合と同様)、新しい値は配列の最大インデックスより1大きい位置から始まります。配列(インデックス配列の場合)に追加するか、関連配列に追加のキーと値のペアとして追加します。 文字列値変数に適用すると、値が拡張され、変数値に追加されます。
あなたは明らかに後者を得ます。
1 + 125 + 27 = 112527
したがって、いくつかのオプションがあります。armstrong_sum
整数として宣言するか
#!/bin/bash
declare -i INPUT=$1
declare -i armstrong_sum=0
arr=($(fold -w1 <<< "$INPUT"))
for index in "${!arr[@]}"
do
armstrong_sum+=$(( ${arr[index]}**${#arr[@]} ))
done
echo "$armstrong_sum"
または、式全体を((
と))
ie で囲み、算術評価を保証します。
(( armstrong_sum += ${arr[index]}**${#arr[@]} ))