数値リストをコマンドライン引数として使用し、その数値の合計を出力する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 x
。for 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' "$(( $* ))"