次のコマンドはどういう意味ですか? x=${1//[^0-9]/} と ${#x}

次のコマンドはどういう意味ですか? x=${1//[^0-9]/} と ${#x}
#!/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にありますabccこれが、ループがゼロから文字列の長さより小さい1に移動する理由です。

スクリプトが呼び出されると、出力がであるsumscript.sh 123456789ことが簡単にわかります45sumscript.sh 1234x5x6789算術にエラーが発生するので、なぜこの空白を許可するのかわかりません。

答え2

x=${1//[^0-9]/}与えられたスクリプトの最初の引数を受け入れ、数字以外の文字をすべて削除します。

$ script 123xxx
# `$1` is equal to 123

for ((i=0; i<${#x}; i++)); do$x0から(3)の値から1の長さを引いた値(2)まで繰り返します。

# i is equal in the loop to
0
1
2

((sum+=${x:i:1}))各ループの文字列内の指定された文字位置sumに値を追加します。xi

0 + 1 = 1
1 + 2 = 3
3 + 3 = 6

したがって、最終結果sumは6です。

関連情報