
ユーザーがコマンドライン引数の合計を計算するために使用できるbashスクリプトをどのように生成しますか?たとえば、私のスクリプトがsumであるとします。
sum 3
サム
sum 3 5
8
sum 9 8 21
38
ちょっと待ってください. 2番目のコマンドライン引数を特定の変数に参照する方法、またはコマンドライン引数の総数を取得する方法がわかりません。
答え1
いいえbash
。一般sh
も使用できます。
#! /bin/sh -
IFS=+; echo "$(($*))"
$*
$IFS
POSIXシェルは、最初の文字($IFS
未設定の場合は空白、空の場合はnull)で区切られた位置引数(この場合はスクリプトの引数)のリストに展開されます$IFS
。$((...))
シェルの内部算術拡散演算子です(10進数、8進数、16進数をサポートします)。
浮動小数点サポートが必要な場合は、以下を使用することもできますが、ksh93
(zsh
整数算術bash
以上の機能をサポートする)などの他のシェルが必要です。bash
awk
#! /usr/bin/awk -f
BEGIN {t=0; for (i in ARGV) t+=ARGV[i]; print t}
long
これは(整数の場合)実装されたシステムとdouble
(浮動小数点の場合)型の数値を使用します。入力した数字は、10進数浮動小数点または英国工学表記法でなければなりません(浮動小数点区切り記号は次のとおりです)。期間ロケールに関係なく文字)。一部の実装では、最初の数字が負の数であれば、それをオプションとして解釈しようとするawk
ため失敗します。awk
POSIXLY_CORRECTが環境に存在する場合、いくつかのawk
実装(GNUなど)は、バイナリ指数表記法を含む16進数もサポートします。awk
または--non-decimal-data
8進数と16進数を理解するを使用してください。
$ POSIXLY_CORRECT=1 ./sum 0xap3 0xa
90 # (0xa * 2^3) + 0xa
$ awk --non-decimal-data -f ./sum 010
8
答え2
以下のbash機能を使用できます。
sum() {
local sum=0
for arg in "$@"; do
(( sum += arg ))
done
echo $sum
}
答え3
非循環的な変形:
{ printf %d+ "$@"; echo 0; } | bc
はい
上記はスクリプトファイルですsum
。
#!/bin/bash
{ printf %d+ "$@"; echo 0; } | bc
次のように実行します。
$ ./sum 4
4
$ ./sum 4 4 5
13