次のコマンドはどういう意味ですか? 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算術にエラーが発生するので、なぜこの空白を許可するのかわかりません。

おすすめ記事