接受参数、求和的脚本

接受参数、求和的脚本

我正在尝试完成一个脚本,该脚本将从命令行获取 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
  }
}
  • 应该接受浮点数(但不接受infnan或类似的东西0x1p6),十六进制和八进制数
  • 对于每个参数,仅考虑可解释为数字的前导部分(忽略空格)。
  • 请注意,区域设置尊重小数点(.在英语中,,在许多其他语言中)。
  • 浮点数的打印就像使用 一样printf("%.6g"),整数的打印就像使用 一样printf("%d")。在内部,gawk使用 C 编译器double和内部类型,但在最新版本中可以被告知对选项和变量long使用任意精度。-MPREC
$ locale decimal_point
.
$ that-script 1.23 -1e2 0x30 010 garbage
1.23 - 100 + 48 + 8 + 0 = -42.77

相关内容