我正在尝试完成一个脚本,该脚本将从命令行获取 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
建立在许多类似问题之一的解决方案:
#!/bin/sh
IFS=+
printf '%s = %s\n' "$*" "$(($*))"
"$*"
将扩展为位置参数(命令行参数),以 分隔$IFS
。我们分别IFS
设置+
。"$(($*))"
使用$(( ... ))
,它是一个算术替换,来计算 的算术值$*
,即命令行参数以及+
它们之间的值。printf
用于输出两个字符串,=
它们之间有一个。
测试:
$ ./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
上面的脚本中缺少的是对提供的命令行参数的验证,以确保它们是整数。这是针对问题中的一个值完成的“检查输入数字是否为整数”。
答案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
),十六进制和八进制数 - 对于每个参数,仅考虑可解释为数字的前导部分(忽略空格)。
- 请注意,区域设置尊重小数点(
.
在英语中,,
在许多其他语言中)。 - 浮点数的打印就像使用 一样
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