Bash에서 입력 추가 및 계산

Bash에서 입력 추가 및 계산

사용자가 입력한 숫자의 수를 더하고 계산하는 bash 스크립트를 만드는 방법은 무엇입니까? 사용자가 무제한으로 입력할 수 있으므로 변수를 처리하는 방법을 모르겠습니다. 사용자가 아무것도 입력하지 않은 경우 오류 메시지가 표시되어야 합니다. 이것은 지금까지의 코드입니다. 틀릴 수도 있으니 안심하세요. 저는 아직 초보자입니다.

#!/bin/bash
if [ read = null ]
  echo "Invalid input."
else
  echo "please input numbers to add"
  #add numbers inputted
  read num1 num2 num3 num4 num5 num6 num7 
  #i put 7 variables but it needs to add however many numbers the user puts
  TOTAL=$((num1+num2+num3+num4+num5+num6+num7))
  #count how many numbers are inputted
  read num1 num2 num3 num4 num5 num6 num7
  wordCount=$((num1+num2+num3+num4+num5+num6+num7 | wc -c))
  echo "Your total is $TOTAL and the number of inputs you entered is $wordCount"\
fi

답변1

  1. if [ read = null ]줄은 완전히 넌센스입니다. 이것은 전혀 의미가 없습니다.

  2. 고정된 수의 변수가 아닌 배열로 숫자를 읽을 수 있도록 bash를 사용하고 있습니다.

다음과 같이 시도해 보세요.

$ cat add.sh
#!/bin/bash

while true; do
  printf "Please input numbers to add: "
  read -r -a numbers

  # exit if input is empty
  [ "${#numbers[@]}" == 0 ] && break

  # check if input consists only of numbers
  # (integers or decimals allowed)
  for n in "${numbers[@]}"; do
    if ! [[ "$n" =~ ^[0-9]+(\.[0-9]+)?$ ]] ; then
      echo "Invalid input: $n"
      continue 2
    fi
  done

  expression="$(printf "%s+" "${numbers[@]}" | sed -e 's/+$//')"
  echo "$expression" | bc
done

루프는 영원히 반복( while true)하여 입력을 요청하고 입력을 배열로 읽습니다 numbers.

의 요소 수가 numbers0이면 while 루프를 종료합니다 break. 그런데, "${#numbers[@]}"배열의 요소 수, 즉 원하는 "단어 수"를 반환합니다. 원하는 경우 echo이를 사용하거나 인쇄 할 수 있습니다. printf나는 당신을 위해 모든 숙제를 해줄 것이 아니므로 당신에게 맡길 것입니다.

입력 요소가 숫자가 아닌 경우 "잘못된 입력"을 인쇄하고 while 루프의 시작 부분으로 돌아갑니다( 이 시점에서 스크립트가 루프와 루프 내부에 있으므로 continue 2- 인수가 필요합니다 . 그렇지 않은 경우 루프를 종료합니다 . 즉, "잘못된 입력"을 인쇄한 다음 계산을 수행하려고 시도합니다.)2whilefor2for

그렇지 않으면 를 사용하여 문자열( 라는 변수에 expression) 을 생성합니다 printf. 문자열 끝에서 후행 문자를 제거하는 sed데 사용됩니다 .+

그런 다음 표현식을 다음으로 파이프하십시오.기원전, 계산기 도구입니다. Bash에 내장된 순수 정수 연산과 달리 bc부동 소수점 숫자를 처리할 수 있습니다. bc기본적으로 시스템에 설치되지 않을 수도 있지만 Linux를 실행하는 경우 패키지로 사용할 수 있습니다(예: Debian에서는 package 에 있음 bc). 이는 POSIX 사양의 일부이므로 다른 UNIX 변형에서도 작동해야 합니다.https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html

$ ./add.sh 
Please input numbers to add: 1 2 3
6
Please input numbers to add: 1 2 3 xyz
Invalid input: xyz
Please input numbers to add: 4 5 6 7 8 9
39
Please input numbers to add: 

이 예제 실행에서는 첫 번째 입력 줄이 표현식으로 변환된 1+2+3다음 파이프를 통해 bc계산을 수행합니다. 세 번째 입력 행은 으로 변환되어 4+5+6+7+8+9파이프됩니다 bc.

답변2

쉘은 특히 bash산술 연산을 자체적으로 수행하는 데 좋지 않습니다. 그뿐만 아니라, 사용자가 제공한 입력에 대해 산술 연산을 수행하도록 하는 것은 일반적으로 다음을 구성합니다.임의 명령 실행 취약점.

그러나 그들이 잘하는 것은 명령을 실행하는 데 사용되는 것이기 때문입니다.

#! /bin/sh -
awk 'BEGIN {printf "Enter numbers, space separated: "}
     {
       sum = 0
       for (i = 1; i <= NF; i++) sum += $i
       print "Sum of those "NF" numbers: "sum
       exit
     }'

여기에서는 셸(여기서는 sh필요하지 않기 때문에 사용됨 bash)이 호출되어 awk입력 줄을 처리하고 각 필드의 값을 추가합니다. awk정수 및 부동 소수점 숫자를 지원하며 앞에 0이 있는 숫자가 8진수로 처리되는 데 문제가 없으며 bash셸 산술 ACE 취약점이 없습니다.

문자열을 숫자로 디코딩하려고 할 때 최선을 다하고 이를 인식할 수 없으면 중지합니다( 1e4foo예: aka ).1e410000whatever0


1 가능하긴 하지만읽다입력이 터미널에서 나오지 않으면 두 개 이상이 됩니다.

관련 정보