매개변수와 합계를 허용하는 스크립트

매개변수와 합계를 허용하는 스크립트

명령줄에서 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), 16진수 및 8진수를 허용해야 합니다.
  • 각 인수에 대해 숫자로 해석될 수 있는 앞부분만 고려됩니다(공백은 무시됩니다).
  • 로케일은 소수점( 다른 많은 언어와 마찬가지로 .영어 )을 존중합니다.,
  • 부동소수점 숫자는 를 사용하는 것처럼 인쇄되고 printf("%.6g"), 정수는 를 사용하는 것처럼 인쇄됩니다 printf("%d"). 내부적으로는 gawkC 컴파일러 double와 내부 유형이 사용되지만 최근 버전에서는 long옵션과 변수에 대해 임의의 정밀도를 사용하라는 지시를 받을 수 있습니다.-MPREC
$ locale decimal_point
.
$ that-script 1.23 -1e2 0x30 010 garbage
1.23 - 100 + 48 + 8 + 0 = -42.77

관련 정보