#!/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
算術にエラーが発生するので、なぜこの空白を許可するのかわかりません。
答え2
x=${1//[^0-9]/}
与えられたスクリプトの最初の引数を受け入れ、数字以外の文字をすべて削除します。
$ script 123xxx
# `$1` is equal to 123
for ((i=0; i<${#x}; i++)); do
$x
0から(3)の値から1の長さを引いた値(2)まで繰り返します。
# i is equal in the loop to
0
1
2
((sum+=${x:i:1}))
各ループの文字列内の指定された文字位置sum
に値を追加します。x
i
0 + 1 = 1
1 + 2 = 3
3 + 3 = 6
したがって、最終結果sum
は6です。