#!/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
注:これは問題に対する解決策ではなく、すでに持っているコードをクリーンアップする方法と機能しない理由を示すだけです。
まず、コードを一貫してインデントする必要があります。そうしないと、コードが複雑に見え、簡単に迷子になる可能性があります。
次に、構文エラーなしでコードを実行するには、いくつかの問題を解決する必要があります。
- 条件文に落ちました
$
ねnum
while
- 行方不明
do
とdone
forfor
ループ。
これらのエラーを修正し、余分な空白行をインデントして削除すると、コードは次のようになります。
#!/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/