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 ))
자세한 내용은 http://tldp.org/LDP/abs/html/arithexp.html 을 참조하십시오.
그것을하는 방법은 수천 가지가 있습니다. 사용하는 방법은 다음과 같습니다 dc
.
dc <<<"$num1 $num2 + p"
그러나 그것이 당신을 위해 너무 bash-y (또는 이식성 문제)라면 말할 수 있습니다.
echo $num1 $num2 + p | dc
그러나 아마도 당신은 RPN이 불안하고 이상하다고 생각하는 사람들 중 하나 일 것입니다. 걱정 마세요! bc
당신을 위해 여기 있습니다 :
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
합니다.
bash에서
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))"
metab을 정수로 선언 한 다음 산술 평가를 사용해야합니다
declare -i metab num
...
num+=metab
...
자세한 내용은 https://www.gnu.org/software/bash/manual/html_node/Shell-Arithmetic.html#Shell-Arithmetic을 참조 하십시오.
POSIX
에서 수행 bash
할 수있는 또 다른 휴대용 호환 방법으로 .bashrc
모든 산술 연산자를위한 함수로 정의 할 수 있습니다 .
addNumbers () {
local IFS='+'
printf "%s\n" "$(( $* ))"
}
명령 줄에서 다음과 같이 호출하면됩니다.
addNumbers 1 2 3 4 5 100
115
아이디어는 확장 후 단어 분할 에 사용되는 특수 변수 인 입력 필드 구분 기호 (IFS) 를 bash
사용하고 행을 단어로 분할하는 것입니다. 이 함수는 단어 분리 문자를 합계 연산자로 사용하도록 값을 로컬로 변경합니다 +
.
(가) 기억 IFS
로컬로 변경되고 않습니다 NOT 기본에 효과가 걸릴 IFS
기능 범위 이외의 동작을. man bash
페이지 에서 발췌
쉘은 IFS의 각 문자를 분리 문자로 취급하고 다른 확장 결과를이 문자의 단어로 나눕니다. IFS가 설정되지 않았거나 해당 값이 정확히이면 기본값, 시퀀스,, 및 이전 확장 결과의 시작 및 끝에서 무시되며, 시작 또는 끝이 아닌 IFS 문자 시퀀스가 구분됩니다. 말.
는 "$(( $* ))"
나누기 위해 전달 된 인수 목록을 나타내고 +
나중에 합계 값이 printf
함수를 사용하여 출력 됩니다. 다른 산술 연산에 대한 범위를 추가하기 위해이 기능을 확장 할 수 있습니다.
#!/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
참고 URL : https://stackoverflow.com/questions/6348902/how-can-i-add-numbers-in-a-bash-script
'Programming' 카테고리의 다른 글
jQuery를 사용하여 동적 HTML 요소에 이벤트를 어떻게 첨부합니까? (0) | 2020.02.11 |
---|---|
들여 쓰기 오류 : 들여 쓰기가 외부 들여 쓰기 레벨과 일치하지 않습니다 (0) | 2020.02.11 |
테이블 또는 열에 대한 모든 외래 키를 보려면 어떻게합니까? (0) | 2020.02.11 |
명령문의 "INSERT INTO dbo.Blah"부분을 반복하지 않고 여러 행을 삽입하려면 어떻게합니까? (0) | 2020.02.11 |
VirtualBox vmdk 파일의 크기를 조정하는 방법 (0) | 2020.02.11 |