![次のコマンドはどういう意味ですか? x=${1//[^0-9]/} と ${#x}](https://linux33.com/image/198209/%E6%AC%A1%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AF%E3%81%A9%E3%81%86%E3%81%84%E3%81%86%E6%84%8F%E5%91%B3%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%20x%3D%24%7B1%2F%2F%5B%5E0-9%5D%2F%7D%20%E3%81%A8%20%24%7B%23x%7D.png)
#!/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です。