$ @は数学ループに使用されます。

$ @は数学ループに使用されます。

数値リストをコマンドライン引数として使用し、その数値の合計を出力するBashスクリプトを作成しようとしています。

したがって、スクリプトが実行されたscript.sh 1 555 22 122 66後、すべてが要約されます。変数に渡してループを実行する必要があることを知っていますが、数学を実行するためにコンテンツをintに$@変換する方法を理解していません。$@私はこれを試みます:

#!/bin/bash
for i in $@
do
    $@+$@
    echo "the total is `$@`"
done

答え1

通常、算術$((...))拡張に引数を使用すると、自動的に整数に変換されます。このループはすべてのパラメータを合計します。

for x; do sum=$((sum+x)); done; echo "$sum"

acプログラムがargv []配列を処理すると、シェルはすべての引数を別々のメモリ位置にキャッシュします。シェルユーザーは配列を直接処理する必要はなく、シェルはそれを$ 1、$ 2、$ 3などに割り当てて助けます。シェルは「$@」などのリストも抽象化します。最後に、構文はすべての引数を繰り返す略語ですfor xfor x in "$@"

引数が0で始まらない10進数、0で始まる8進数、またはで始まる16進数0xで、合計がオーバーフローしないとします(64ビットシステムでは2 ^ 63-1)。

このリスト:

$ ./script 12 021 0xab

印刷されます200(小数点結果)。

答え2

次の方法でこれを実行できます。

tr ' ' '+' <<<"$@" | bc

渡されたすべての引数を取り、スペースを記号に置き換えて+からbc

答え3

引数を 1 つずつリストします。

total=0
while [ -n "$1" ]; do
  total=$((total + "$1"))
  shift
done

またはforループを使用してください。

total=0
for argument; do
  total=$((total + "$argument"))
done

答え4

#!/bin/sh

IFS='+'
printf '%s\n' "$*" | bc

テスト

$ ./script.sh 1 2 3 -1 30 0.1
35.1

"$*"シェル変数の最初の文字で区切られた位置引数(コマンドライン引数)に展開されますIFS。 plusに設定し、評価するIFS文字列を渡します。bc

整数演算のみが必要な場合:

#!/bin/sh

IFS='+'
printf '%d\n' "$(( $* ))"

関連情報