사용자가 입력한 숫자의 수를 더하고 계산하는 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
이
if [ read = null ]
줄은 완전히 넌센스입니다. 이것은 전혀 의미가 없습니다.고정된 수의 변수가 아닌 배열로 숫자를 읽을 수 있도록 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
.
의 요소 수가 numbers
0이면 while 루프를 종료합니다 break
. 그런데, "${#numbers[@]}"
배열의 요소 수, 즉 원하는 "단어 수"를 반환합니다. 원하는 경우 echo
이를 사용하거나 인쇄 할 수 있습니다. printf
나는 당신을 위해 모든 숙제를 해줄 것이 아니므로 당신에게 맡길 것입니다.
입력 요소가 숫자가 아닌 경우 "잘못된 입력"을 인쇄하고 while 루프의 시작 부분으로 돌아갑니다( 이 시점에서 스크립트가 루프와 루프 내부에 있으므로 continue 2
- 인수가 필요합니다 . 그렇지 않은 경우 루프를 종료합니다 . 즉, "잘못된 입력"을 인쇄한 다음 계산을 수행하려고 시도합니다.)2
while
for
2
for
그렇지 않으면 를 사용하여 문자열( 라는 변수에 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 ).1e4
10000
whatever
0
1 가능하긴 하지만읽다입력이 터미널에서 나오지 않으면 두 개 이상이 됩니다.