#!/bin/bash
x=${1//[^0-9]/}
sum=0
for ((i=0; i<${#x}; i++)); do
((sum+=${x:i:1}))
done
echo $sum
私はLinuxに初めて触れました。このコードを段階的に説明できますか?私が理解していない部分を太字で見せたいです。
ここに答えがあります。
$ ./summ_of_digits 115
7
処置:パラメータの数値合計を形成してください。
- プログラム名は数字の合計です
- このプログラムは、1 つ以上の数値を引数として受け取り、指定された各数値の数値の合計を計算します。
- 出力の各行には、数値とその合計が含まれます。
- 例:
$ digit sum 19 115
19 10
115 7
ベストアンサー1
x=${1//[^ 0-9]/}
$1
最初の位置パラメーター/コマンド行パラメーター。
${var//pattern/replace}
値を取り、$var
次の項目をすべて置き換えます。模様そして変える。ここでパターンはです[^ 0-9]
。これは、(*)の間にスペースや0
単一文字がないことを意味します。9
これ代替部分が空であるため、削除され、結果が展開され、次に割り当てられますx
。
(*ASCII以外の数字を含めることができるロケールによっては、後でスクリプトで算術演算を使用できない場合があります。)
${#x}
${#var}
変数内の値の長さ。
${x:i:1}
${var:position:count}
次に展開計算次に始まる文字場所$var
の値によっては、${x:i:1}
位置にある文字も同じですi
。
たとえば、参照してください。3.5.3 シェルパラメータの拡張Bashのマニュアルにあります。
for ((i=0; i<${#x}; i++))
for
これは、Cの一般的なループ型とやや似た算術ループです。よりhttps://www.gnu.org/software/bash/manual/html_node/Looping-Constructs.html
文字位置は0からインデックス付けされるため、文字列では位置2にありますabc
。c
これが、ループがゼロから文字列の長さより小さい1に移動する理由です。
スクリプトが呼び出されると、出力がであるsumscript.sh 123456789
ことが簡単にわかります45
。sumscript.sh 1234x5x6789
算術にエラーが発生するので、なぜこの空白を許可するのかわかりません。