プログラムはどのように複数の数値を引数として取り、計算しますか?例: 19 10,13 4, 12 3

プログラムはどのように複数の数値を引数として取り、計算しますか?例: 19 10,13 4, 12 3
#!/bin/bash
# Show help function
# Call with: -h 
function help(){ cat << EOF
Arguments:
Calculate the sum of several numbers. Example: $sum 19 115 21 
                                                    10  7   3
As soon as a letter is given in the argument, the program issues an error message. 
EOF
}

#Main program
if [ "$1" == "-h" ] ; then
        help
        exit
    fi
check='^[0-9]+$'
    if ! [[ $var =~ $check ]] ; then
        echo "error: Caution! It is not a number!"
            continue
    fi

x=${1//[^0-9]/}
sum=0

for ((i=0; i<${#x}; i++));

while [[ num -gt 0 ]];do
var=$(($num % 10))
num=$(($num / 10))
sum=$(($sum + $var))
done

echo $sum

プログラムは1つ以上の数字を引数として受け取り、指定された各数字の数字の合計を計算する必要があります。私は何も得られませんでした。プログラムはどのように複数の数値を引数として受け取り、計算しますか? ifループとwhileの両方を使用しました。説明は80文字を超えることはできません。

答え1

これは反復的なアプローチです。数字数字を入力して合計します。

sum_digits() {
    local num=$1 len=${#1} sum=0 digit i
    for ((i=0; i<len; i++)); do
        digit=${num:i:1}
        sum=$((sum + digit))
    done
    echo "$sum"
}

それから

$ sum_digits 123
6
$ sum_digits 987654321
45

${var:offset:length}抽出するシェルのパラメータ拡張。サブストリング変数の値を超えています。

答え2

私の考えでは、あなたが仕事を予想よりはるかに複雑にしているようです。これがあなたに効果があることを確認してください

#!/bin/bash

die()
{
  echo >&2 "$@"
  exit 1
}

usage()
{
  echo >&2 "Usage: ....."
  die
}

calc() 
{ 
  if (( $# < 1 )); then usage; fi
  local args="$@"; 
  re='^[0-9]+$'
  total=0
  for n in ${args[@]}; do
   [[ $n =~ $re ]] || die "A non digit was provided"
   ((total += n))
  done
  echo "$total"
}
calc "$@"

スクリプトを実行します。

./script 22 20

これがあなたの答えです。

答え3

注:これは問題に対する解決策ではなく、すでに持っているコードをクリーンアップする方法と機能しない理由を示すだけです。


まず、コードを一貫してインデントする必要があります。そうしないと、コードが複雑に見え、簡単に迷子になる可能性があります。

次に、構文エラーなしでコードを実行するには、いくつかの問題を解決する必要があります。

  • 条件文に落ちました$numwhile
  • 行方不明dodoneforforループ。

これらのエラーを修正し、余分な空白行をインデントして削除すると、コードは次のようになります。

#!/bin/bash
# Show help function
# Call with: -h
function help(){
cat << EOF
Arguments:
Calculate the sum of several numbers. Example: $sum 19 115 21
                                                    10  7   3
As soon as a letter is given in the argument, the program issues an error message.
EOF
}

# Main program

if [ "$1" == "-h" ] ; then
  help
  exit
fi

check='^[0-9]+$'
if ! [[ $var =~ $check ]] ; then
   echo "error: Caution! It is not a number!"
   continue
fi

x=${1//[^0-9]/}
sum=0
for ((i=0; i<${#x}; i++)) ; do
  while [[ $num -gt 0 ]] ; do
    var=$(($num % 10))
    num=$(($num / 10))
    sum=$(($sum + $var))
  done
done
echo $sum

今はしなければならない実行されますが、まだ必要な操作を実行しません。

まず、コードのどの部分にも割り当てませんnum(割り当てていません)。varおそらく各パラメータに順番に割り当てたいと思います。

  • を割り当てないと、var常に「これは数値ではありません」というエラーが発生します。
  • を割り当てないと、num合計は常にゼロになります。

答え4

Raku(以前のPerl_6)の使用

raku -e '.put for @*ARGS.map( *.comb).map( *.sum);' 19 115 21 22 20

出力:

10
7
3
4
2

上記は、Perlファミリーの言語であるRakuで書かれたソリューションです。つまり、コマンドライン値@*ARGSが配列として受け入れられ、各値が個別の文字(comb-ed)に分割され、個々の文字がsumマージされます。

数値に興味がある場合、Rakuは以下の( "NUmerator DEnominator")関数のRatような非常に賢い数値関数を提供します。nude

raku -e ' say( .nude, " == ", .Num ) for @*ARGS.map( *.Rat);' 1 2/2 1/2 3/3 2/3 1/3 4/4 3/4 2/4 1/4

出力:

(1 1) == 1
(1 1) == 1
(1 2) == 0.5
(1 1) == 1
(2 3) == 0.6666666666666666
(1 3) == 0.3333333333333333
(1 1) == 1
(3 4) == 0.75
(1 2) == 0.5
(1 4) == 0.25

https://docs.raku.org/言語/variables#index-entry-@*ARGS
https://docs.raku.org/type/Rational
https://raku.org/

関連情報