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
이 문제는 두 가지 간단한 질문으로 나눌 수 있습니다.
- 네 가지 산술 연산을 어떻게 할 수 있나요?
- 어떤 숫자가 더 작은지/큰지 어떻게 알 수 있나요?
네 가지 산술 연산
기호를 사용하여 이를 수행 할 수 있습니다 $((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))
합계의 최대값을 제공합니다.a
b
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
이것이 작동하는 방식 때문에 입력이 손상되고 read
Bash는 부동 소수점 숫자를 지원하지 않으므로 오류도 발생합니다. 입력 데이터의 소스에 따라 온전한지 확인하는 것이 좋습니다.