コマンドラインから3つの数字を取得して合計し、出力を「1 + 2 + 3 = 6」とマークするスクリプトを完成させようとしています。これは私のコードです。
clear
echo
for count
do
echo -n "$count + "
done
echo
echo
echo
echo All Done
「1 + 2 + 3 +」を出力することができますが、最後のプラス記号または「= 6」を削除する方法がわかりません。
答え1
確立された多くの同様の問題の1つに対する解決策:
#!/bin/sh
IFS=+
printf '%s = %s\n' "$*" "$(($*))"
"$*"
で区切られた位置引数(コマンド行引数)に展開されます$IFS
。私たちは別々にIFS
設定しました+
。"$(($*))"
算術置換子を使用して、コマンドライン引数の$(( ... ))
算術値とその間の値を計算します。$*
+
printf
2つの文字列の間に1つの2つの文字列を出力するために使用されます=
。
テスト:
$ ./script.sh 1 2 3
1+2+3 = 6
$ ./script.sh -1 2 3
-1+2+3 = 4
$ ./script.sh 1 2 3 4 2 2 3 1
1+2+3+4+2+2+3+1 = 18
上記のスクリプトで欠けているのは、提供されたコマンドライン引数が整数であることを確認することです。これは質問の1つの値に対して行われます。」入力された数値が整数であることを確認する」。
答え2
#! /usr/bin/gawk -E
BEGIN {
sum = 0
if (ARGC > 1) {
for (i = 1; i < ARGC; i++) {
n = strtonum(ARGV[i])
printf "%s", i == 1 ? n : n < 0 ? " - " (-n) : " + "n
sep = " + "
sum += n
}
print " = "sum
}
}
inf
浮動小数点(しかし、nan
または同様のものは許可されていません0x1p6
)、16進数、および8進数を許可する必要があります。- 各引数に対して数字として解釈できる前の部分のみが考慮されます(スペースは無視されます)。
- ロケールは小数点(他の多くの言語と同様に
.
英語)を尊重します。,
- 浮動小数点数はを使用するかのように印刷され
printf("%.6g")
、整数はを使用するかのように印刷されますprintf("%d")
。内部的にはgawk
Cコンパイラdouble
と内部型が使用されますが、最近のバージョンではlong
オプションと変数に任意の精度を使用するように指示することができます。-M
PREC
$ locale decimal_point
.
$ that-script 1.23 -1e2 0x30 010 garbage
1.23 - 100 + 48 + 8 + 0 = -42.77