명령줄에서 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")
. 내부적으로는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