Bash 스크립트에서 숫자를 추가하려면 어떻게 해야 합니까?
나는 이 Bash 스크립트를 가지고 있고 16행에서 문제가 있었습니다.15번 라인의 이전 결과를 16번 라인의 변수에 추가하려면 어떻게 해야 합니까?
#!/bin/bash
num=0
metab=0
for ((i=1; i<=2; i++)); do
for j in `ls output-$i-*`; do
echo "$j"
metab=$(cat $j|grep EndBuffer|awk '{sum+=$2} END { print sum/120}') (line15)
num= $num + $metab (line16)
done
echo "$num"
done
정수의 경우:
산술 확장 사용:
$((EXPR))
num=$((num1 + num2)) num=$(($num1 + $num2)) # Also works num=$((num1 + 2 + 3)) # ... num=$[num1+num2] # Old, deprecated arithmetic expression syntax
외부 사용
expr
효용.이것은 정말 오래된 시스템에만 필요합니다.num=`expr $num1 + $num2` # Whitespace for expr is important
부동 소수점의 경우:
Bash는 이 기능을 직접 지원하지 않지만 다음과 같은 외부 도구를 사용할 수 있습니다.
num=$(awk "BEGIN {print $num1+$num2; exit}")
num=$(python -c "print $num1+$num2")
num=$(perl -e "print $num1+$num2")
num=$(echo $num1 + $num2 | bc) # Whitespace for echo is important
과학적 표기법을 사용할 수도 있습니다(예:2.5e+2
).
일반적인 함정:
변수를 설정할 때 양쪽에 공백을 둘 수 없습니다.
=
그렇지 않으면 셸이 첫 번째 단어를 실행할 응용 프로그램의 이름으로 해석하도록 강제합니다(예:num=
또는num
)num= 1
num =2
bc
그리고.expr
각 숫자와 연산자를 별도의 인수로 예상하므로 공백이 중요합니다.다음과 같은 인수를 처리할 수 없습니다.3+
+4
.num=`expr $num1+ $num2`
사용$(( ))
산술적 확대
num=$(( $num + $metab ))
13장 참조. 자세한 내용은 산술 확장을 참조하십시오.
그것을 하는 데는 천 가지의 방법이 있습니다.다음은 (무제한 정밀 산술을 지원하는 역폴란드 데스크 계산기)을 사용하는 방법입니다.
dc <<<"$num1 $num2 + p"
하지만 그것이 당신에게 너무 수줍어한다면 (또는 휴대성이 중요하다)라고 말할 수 있습니다.
echo $num1 $num2 + p | dc
하지만 당신은 RPN이 역겹고 이상하다고 생각하는 사람들 중 한 명일 수도 있습니다. 걱정하지 마세요! 여기 있습니다.
bc <<< "$num1 + $num2"
echo $num1 + $num2 | bc
즉, 스크립트에 대해 수행할 수 있는 몇 가지 관련 없는 개선 사항이 있습니다.
#!/bin/bash
num=0
metab=0
for ((i=1; i<=2; i++)); do
for j in output-$i-* ; do # 'for' can glob directly, no need to ls
echo "$j"
# 'grep' can read files, no need to use 'cat'
metab=$(grep EndBuffer "$j" | awk '{sum+=$2} END { print sum/120}')
num=$(( $num + $metab ))
done
echo "$num"
done
Bash FAQ 022에서 설명한 것처럼 Bash는 부동 소수점 번호를 기본적으로 지원하지 않습니다.부동 소수점 수를 합해야 하는 경우 외부 도구 사용(예:bc
또는dc
)가 필요합니다.
이 경우 해결책은 다음과 같습니다.
num=$(dc <<<"$num $metab + p")
부동 소수점 수를 다음에 추가하는 방법num
.
바시에서,
num=5
x=6
(( num += x ))
echo $num # ==> 11
Bash는 정수 산술만 처리할 수 있기 때문에 AWK 명령이 부분을 반환하면 다시 설계해야 합니다. 여기 AWK에서 모든 산술을 수행하기 위해 코드를 약간 다시 작성했습니다.
num=0
for ((i=1; i<=2; i++)); do
for j in output-$i-*; do
echo "$j"
num=$(
awk -v n="$num" '
/EndBuffer/ {sum += $2}
END {print n + (sum/120)}
' "$j"
)
done
echo "$num"
done
저는 항상 구문을 잊어버려서 구글 검색에 왔지만, 제가 익숙한 구문:P를 찾을 수 없습니다.이것은 저에게 가장 깨끗하고 다른 언어에서 제가 기대하는 것에 더 충실합니다.
i=0
((i++))
echo $i;
저도 이 방법이 너무 마음에 들어요.더 적은 혼란이 있습니다.
count=$[count+1]
#!/bin/bash
read X
read Y
echo "$(($X+$Y))"
메타데이터를 정수로 선언한 다음 산술 평가를 사용해야 합니다.
declare -i metab num
...
num+=metab
...
에 내장된 것을 합니다.let
은 와유합다니와 .(( expr ))
:
A=1
B=1
let "C = $A + $B"
echo $C # C == 2
Bash에서 수행할 수 있는 또 다른 휴대용 POSIX 호환 방법으로, 다음에서 함수로 정의할 수 있습니다..bashrc
모든 연산자의 편의를 위해.
addNumbers () {
local IFS='+'
printf "%s\n" "$(( $* ))"
}
그냥 명령 줄로 불러요
addNumbers 1 2 3 4 5 100
115
이 아이디어는 확장 후 단어 분할에 사용되는 Bash의 특수 변수인 IFS(Input-Field-Separator)를 사용하고 줄을 단어로 분할하는 것입니다.함수는 단어 분할 문자를 합계 연산자로 사용하도록 값을 로컬로 변경합니다.+
.
를 하세요.IFS
로컬로 변경되어 기본값에 적용되지 않습니다.IFS
기능 범위를 벗어나는 행동.서에발것한에서 것.man bash
페이지입니다.
셸은 IFS의 각 문자를 구분 기호로 처리하고 다른 확장의 결과를 해당 문자에 있는 단어로 나눕니다.IFS가 설정되지 않았거나 해당 값이 정확히 기본값인 경우, 이전 확장의 결과 시작과 끝에 있는 , 및 의 시퀀스는 무시되며, 시작 또는 끝에 없는 IFS 문자의 시퀀스는 단어를 구분하는 역할을 합니다.
그"$(( $* ))"
할하 위기 인전목나수다로 분할하기 된 인수 .+
그리고 나중에 합계 값은 다음을 사용하여 출력됩니다.printf
도 있습니다함수를 확장하여 다른 산술 연산의 범위를 추가할 수도 있습니다.
#!/usr/bin/bash
#integer numbers
#===============#
num1=30
num2=5
echo $(( num1 + num2 ))
echo $(( num1-num2 ))
echo $(( num1*num2 ))
echo $(( num1/num2 ))
echo $(( num1%num2 ))
read -p "Enter first number : " a
read -p "Enter second number : " b
# we can store the result
result=$(( a+b ))
echo sum of $a \& $b is $result # \ is used to espace &
#decimal numbers
#bash only support integers so we have to delegate to a tool such as bc
#==============#
num2=3.4
num1=534.3
echo $num1+$num2 | bc
echo $num1-$num2 | bc
echo $num1*$num2 |bc
echo "scale=20;$num1/$num2" | bc
echo $num1%$num2 | bc
# we can store the result
#result=$( ( echo $num1+$num2 ) | bc )
result=$( echo $num1+$num2 | bc )
echo result is $result
##Bonus##
#Calling built in methods of bc
num=27
echo "scale=2;sqrt($num)" | bc -l # bc provides support for calculating square root
echo "scale=2;$num^3" | bc -l # calculate power
#!/bin/bash
num=0
metab=0
for ((i=1; i<=2; i++)); do
for j in `ls output-$i-*`; do
echo "$j"
metab=$(cat $j|grep EndBuffer|awk '{sum+=$2} END { print sum/120}') (line15)
let num=num+metab (line 16)
done
echo "$num"
done
MacOS에서 작동합니다. bc는 명령줄 계산기입니다.
#!/bin/bash
sum=0
for (( i=1; i<=5; i++ )); do
sum=$(echo "$sum + 1.1" | bc) # bc: if you want to use decimal
done
echo "Total: $sum"
언급URL : https://stackoverflow.com/questions/6348902/how-can-i-add-numbers-in-a-bash-script
'programing' 카테고리의 다른 글
'of' 속성이 '관찰 가능한 유형' 유형에 없습니다. (0) | 2023.05.06 |
---|---|
윈도우즈용 명령줄 svn? (0) | 2023.05.06 |
Windows용 Vim - 파일을 저장하고 종료하려면 무엇을 입력해야 합니까? (0) | 2023.05.06 |
sql을 복원하는 동안 psql 잘못된 명령 \N (0) | 2023.05.06 |
작성자를 위해 모든 지점의 로그를 한 번에 가져오는 방법은 무엇입니까? (0) | 2023.05.06 |