Bash 스크립트의 산술

Bash 스크립트의 산술

Bash 스크립트에서 입력을 기준으로 최대값 또는 최소값을 결정하려고 합니다. 예를 들어 입력이 이면 max 20 40출력은 이어야 합니다 40. 입력이 이면 min 20 40출력은 이어야 하며 20임의의 두 숫자에 대해서도 마찬가지입니다.

덧셈, 뺄셈, 곱셈, 나눗셈에도 동일한 연산이 필요합니다. 입력이 이면 6 + 6출력은 입니다 12. 입력이 이면 6 * 6출력은 입니다 36.

내가 겪고 있는 문제는 bash에게 두 숫자를 다시 에코한 다음 최소값 또는 최대값을 표시하거나 더하기, 빼기 등을 수행하도록 지시할 수 있다는 것입니다. 예를 들어 입력이 5 10출력 인 경우 15추가 파일을 실행하는 경우입니다. 하지만 입력이 이고 5 + 10출력이 15.

이제 최대/최소 연산을 잊어버리고 솔루션의 산술 부분에 집중할 수 있습니다. 문제를 더 잘 설명하려면 코드를 다음과 같이 실행해야 합니다.

bash filename.sh
6 * 7
42

첫 번째 줄은 파일을 실행하는 곳이고, 두 번째 줄은 입력을 입력하는 곳이며, 마지막 줄은 출력(답변)이고 그 뒤에 새 줄이 옵니다. 를 곱하면 매우 쉬울 것입니다 6 * 7. 그러나 그렇지 않습니다. 파일을 실행 bash filename.sh하고 Enter를 클릭하면 덧셈, 뺄셈, 곱셈, 나눗셈으로 제한되는 간단한 산술 연산을 입력할 수 있는 다음 줄로 이동해야 합니다.

코드 실행 방법에 대한 추가 예

bash filename.sh
10+ 5
15
bash filename.sh
14 / 7
2
bash filename.sh 
17 - 3
14

스크립트는 입력된 모든 값에 대해 이 작업을 수행할 수 있어야 합니다. 감사합니다.

답변1

이 문제는 두 가지 간단한 질문으로 나눌 수 있습니다.

  1. 네 가지 산술 연산을 어떻게 할 수 있나요?
  2. 어떤 숫자가 더 작은지/큰지 어떻게 알 수 있나요?

네 가지 산술 연산

기호를 사용하여 이를 수행 할 수 있습니다 $((expr)). 더 많은 정보를 보고 싶을 수도 있습니다 man bash. 예:

$ echo $((6 + 6))
12
$ echo $((6 * 6))
36

수량 적음/많음

두 가지를 비교할 수 있습니다숫자[[ expr ]]또는 형태 입니다 [ expr ]. 나는 [[ expr ]]형식을 선호하므로 여기에 있습니다. 보다 작은 [[ $num1 -lt $num2 ]]경우 숫자를 비교합니다 . 그리고 강판인지 확인하십시오. and 는 and 로 쓸 수 없습니다 . 숫자 순서가 아닌 사전순으로 비교됩니다.$num1$num2-gt-lt-gt<>

예:

function max() {
  first=$1
  second=$2
  if [[ $first -lt $second ]]; then
    echo $second
  else
    echo $first
  fi
}

function min() {
  first=$1
  second=$2
  if [[ $first -gt $second ]]; then
    echo $second
  else
    echo $first
  fi
}

용법:

$ max 20 40
40
$ min 20 40
20

답변2

입력값과 계산값을 한 줄에 인쇄한다는 뜻인가요?

list.txt귀하의 질문 목록 은 다음과 같습니다 .

$ cat list.txt
1 + 2
3 + 4
5 + 10

calculating.sh스크립트에서 문자열 입력을 받아들이고 계산된 값을 인쇄하도록 합니다(여기서는 + 연산만 작성했습니다) .

$ cat calculating.sh
#!/bin/bash

varA=$(echo $1 | cut -d' ' -f1)
varB=$(echo $1 | cut -d' ' -f3)
operator=$(echo $1 | cut -d' ' -f2)

echo $(($varA + $varB))

list.txt스크립트를 사용하여 각 항목을 계산하려면 calculating.sh다음을 수행할 수 있습니다.

$ cat list.txt | xargs -I {} sh -c "echo -n {} '= ' && ./calculating.sh '{}'"

1 + 2 = 2
3 + 4 = 6
5 + 10 = 10

xargs"echo -n {} '= ' && ./calculating.sh '{}'"list.txt각 줄을 참조 하는 run 명령의 각 줄을 만듭니다 {}(각 줄을 반복하는 것으로 생각하세요). echo -n {} =귀하의 질문 줄은 개행 없이 = 문자와 함께 인쇄됩니다. 그러면 ./calculating.sh '{}'계산된 값이 인쇄됩니다.

답변3

빠르고 지저분한 표현식을 원한다면 입력 표현식을 쉘의 산술 확장에 푸시할 수 있습니다.

$ cat arith.sh
#!/bin/bash
read -r expr
if [[ $expr = *\$* || $expr = *\`* ]]; then
    echo "invalid entry!" >&2
    exit 1
fi
echo "$(($expr))"

그럼 예를 들어

$ ./arith.sh 
(10+4)*5
70

이 절의 테스트에서는 if명령 대체를 삽입하는 데 사용할 수 있는 달러 기호 또는 백틱이 포함된 입력을 거부합니다. 잘못된 산술 구문은 셸에서 오류를 발생시킵니다.

비교를 위해 C 스타일 비교 연산자 <// <=/ >>=삼항 연산자를 사용할 수 있습니다. 예를 들어 $((a > b ? a : b))합계의 최대값을 제공합니다.ab

max따라서 스크립트를 사용하고 확장하려면 다음을 수행하십시오 min.

$ cat arith2.sh
#!/bin/bash

read -r expr

if [[ $expr = *\$* || $expr = *\`* ]]; then
    echo "invalid entry!" >&2
    exit 1
fi

if [[ $expr = "max "* ]]; then
    read -r op a b <<< "$expr"
    echo "$((a > b ? a : b))"
elif [[ $expr = "min "* ]]; then
    read -r op a b <<< "$expr"
    echo "$((a < b ? a : b))"
else 
    echo "$(($expr))"
fi

max 1 2 3이것이 작동하는 방식 때문에 입력이 손상되고 readBash는 부동 소수점 숫자를 지원하지 않으므로 오류도 발생합니다. 입력 데이터의 소스에 따라 온전한지 확인하는 것이 좋습니다.

관련 정보