공백으로 구분된 한 줄의 정수를 추가하고 절대값을 찾으려고 합니다. 5개의 정수가 있는데 그 중 하나는 음수이고 다른 하나는 양수입니다. 모든 숫자의 절대값을 알 수 있도록 현재의 음수값을 양수로 만드는 방법을 찾으려고 합니다. 이것이 내가 지금까지 가지고 있는 것입니다.
read input
# 1, 5, -17, 32, 12
# expected absolute value: 67
absolute_value()
{
local absolute_value=0
for nums in $input;
do
((absolute_value += nums))
done
echo $absolute_value
}
absolute_value
내 대답은 33이었고 예상 대답은 67이었습니다. 물론 추가되지만 입력 숫자 중 하나가 음수일 수 있으므로 절대값이 아닌 합계를 제공합니다. 혼란스러워서 답을 찾고 있지만 알 수 없습니다. Bash는 나의 가장 강력한 언어가 아니므로 아마도 무시할 것입니다.
답변1
글쎄, 어때?절대값정의?
if [ "$num" -lt 0 ]; then
num=$((-num))
fi
어쨌든, 이것은:
for nums in $input
분사에 의존하고 약간 추악합니다. 누군가가 숫자가 아닌 문자나 전역 문자를 입력하면 흥미로운 효과도 얻을 수 있습니다. Bash를 사용하고 있으므로 값 read -a
을 [[ var -lt 0 ]]
.
그러나 단순히 이렇게 하는 것은 좋지 않습니다. Bash의 산술 확장은 위험하기 때문입니다. 명령은 배열 인덱싱 및 명령 대체를 통해 쉽게 주입될 수 있으며 쉘이 이를 실행합니다. 따라서 먼저 수신된 값이 숫자인지 확인해야 합니다.
#!/bin/bash
read -a nums
sum=0
for a in "${nums[@]}"; do
if [[ $a = *[^-0-9]* ]]; then
echo "invalid number: $a"
exit 1
fi
if [[ a -lt 0 ]]; then
sum=$((sum + -a))
else
sum=$((sum + a))
fi
done
echo "$sum"
0
Bash는 및 로 시작하는 숫자를 각각 8진수와 16진수 로 해석합니다 0x
.
또는 실제 프로그래밍 언어를 사용하면 모든 작업을 수동으로 수행할 필요가 없습니다.
$ python3 -c 'print(sum(map(lambda x: abs(int(x)), str.split(input()))))'
1 5 -17 32 12
67
답변2
매개변수 대체를 사용하여 빼기 기호를 제거할 수 있습니다.
입력 읽기 # 1, 5, -17, 32, 12 # 절대값 기대: 67 절대값() { 지역 절대값=0 $input의 숫자에 대해서는 다음을 수행하십시오. ((절대값+=${nums#-})) 완벽한 에코 $절대값 } 절대값
for 루프를 사용하지 않으려면 다음을 시도해 보세요.
printf "%s\n" ${input/-/} | awk '{ sum += $1 } END { print sum }'
나는 while 루프와 배열을 사용하여 사용자가 수행할 수 있는 입력의 양을 제어하고 입력이 잘못된지 계속 묻습니다.
declare -a arr
declare -a arr_abs
echo "Enter four numbers:"
while true; do
read num
[[ $num =~ ^[^-0-9]$ ]] && echo "Not a number..." && continue
# keep the original values for any other use
arr+=($num)
# create an array with absolute values
arr_abs+=(${num#-})
[[ ${#arr[@]} -eq 4 ]] && break
done
absolute_value() {
sum=$(printf "%s\n" ${arr_abs[@]} | awk '{ sum += $1 } END { print sum }')
echo "The absolute sum is $sum"
}
absolute_value