쉘 - 수학 연산


1) let 연산자

let 명령을 사용하여 기본 정수 산술 연산을 수행합니다. let 명령 사용은 다음 사항을 따라야 합니다.

  • 정수 연산만 지원됩니다.
  • $let을 사용할 때 변수 이름 앞에 부호를 붙일 필요가 없습니다.
  • 연산자 기호 양쪽에 공백이 없어야 합니다.
  • let 결과를 받을 변수가 있어야 합니다.
  • let은 기본 연산 원리를 지원합니다: 먼저 곱셈과 나눗셈, 그 다음 덧셈과 뺄셈, 괄호 안의 연산 먼저

형식:let res=x+y , x 및 y는 할당된 변수여야 하며 변수는 정수여야 하며 res는 x+y의 결과를 받는 데 사용됩니다.


자체 증가(++), 자체 감소(- -) 연산

증가(++) 및 감소(- -)는 변수의 값을 변경합니다.

자동 추가 형식:let x++ let과 변수 사이에 공백이 있고 변수와 ++ 사이에 공백이 없어야 합니다.

자체 감소 형식:let x-- , 쓰기 표준은 동일합니다.

[wjj@learning ~]$ x=1
[wjj@learning ~]$ echo $x
1
[wjj@learning ~]$ let x++
[wjj@learning ~]$ echo $x
[wjj@learning ~]$ let x--
[wjj@learning ~]$ echo $x
1

사전++ 및 사후++

C 언어에서 pre-++와 post-++ 사이에는 분명한 차이가 있습니다.

  • Pre-++: 먼저 ++를 한 다음 실행
  • Post ++: 먼저 실행, ++ 마지막에 실행

Shell은 C언어로 개발되었기 때문에 Shell의 pre-++와 post-++도 위의 원칙을 따른다.

예 1:

x=1 y=1
let z=(x++)+y;echo "z=$z x=$x y=$y"
z=2 x=2 y=1
  • 당연히 post++의 연산 우선순위는 더 낮습니다.
  • 연산 중에 ++ 연산이 있으면 괄호로 묶어야 합니다.
  • post ++이므로 먼저 실행되고 z=x+y마지막에 실행됩니다.x++

예 2:

x=1 y=1
let z=(++x)+y;echo "z=$z x=$x y=$y"
z=3 x=2 y=1
  • Front ++가 우선 순위가 더 높습니다.
  • 먼저 실행 ++x, 나중에 실행x+y

**참고: **자체 증가 및 자체 감소 연산은 계산 매개변수에만 적용 가능하며 x ylet 명령을 받는 매개변수에는 적용되지 않습니다.z


+=, -=, *= 및 /=

Shell의 +=AND 연산자 -=는 C 언어와 동일합니다.

let x+=y에 해당let x=x+y

let x-=y에 해당let x=x-y

let x*=y에 해당let x=x*y

let x/=y에 해당let x=x/y

2) (( )) 연산자

(( ))let과 마찬가지로 기본 정수 산술 연산을 지원하며 다음 사항을 준수해야 합니다.

  • 정수 연산만 지원됩니다.
  • 연산은 가장 안쪽 괄호 안에 기록됩니다.
  • 연산자 기호 양쪽에 공백이 있을 수 있습니다.
  • 변수를 사용하여 결과를 받거나 받지 않을 수 있습니다.
  • 논리 연산 지원

예 1:

echo $((1 + 1))
2
echo $((z = 1 + 1))
2
echo $z
2
  • 괄호 안의 쓰기 사양은 공백을 허용합니다.
  • $추출 작업의 결과를 사용할 수 있습니다.

예 2:

x=1 y=1
echo $((z=(x++)+y))
2
echo $((z += 1))
3
  • pre-++, post-++, += 및 -=에도 동일하게 적용됩니다.

3) [ ] 연산자

[ ]연산자의 사용법은 다음 두 가지와 대략 동일합니다.

  • 정수 연산만 지원됩니다.
  • 액세스 변수는 접두사를 사용하거나 사용하지 않고 []사용할 수 있습니다 .$$
  • 논리 연산 지원

예 1:

echo $[1 + 2]
3
x=$[1 + 2]; echo $x
3
  • [ ]공백이 허용됩니다.
  • 변수 없이 계산 결과를 받을 수 있습니다.

예 2:

y=1
x=$[$y + 1]; echo $x
2
  • []변수에 대한 액세스가 허용되며 변수 이름 앞에 기호를 추가해야 합니다.$

예 3:

y=1
x=$[$y + ((1+2))]; echo $x
4
x=$(( $y + $[1+2])); echo $x
4
  • []변수에 대한 액세스가 허용되며 변수 이름 앞에 기호를 추가해야 합니다.$
  • [](())및 는 다음을 사용하여 서로 중첩됩니다.

4) 논리적 판단

Shell은 C언어의 논리적 판단과 호환되며, 연산에 다음 기호가 나타날 때 논리적 판단을 나타냅니다.

상징 설명하다
||또는| 논리적 또는
&&또는& 논리적이고
>= 크거나 같음
<= 이하
!= 같지 않다
== 판단과 동등하다

논리적 판단이 참이면 1( )을 반환하고, 조건이 참이 아니면 0( 거짓 )을 반환한다.

(())논리 연산은 다음 []에서도 지원됩니다 .

a=$[1 > 2 && 1 < 3];echo $a
0
b=$((1 < 2 || 1 > 3));echo $b
1

5) 특급 도구

expr도구는 기본적인 산술 연산에도 사용할 수 있지만 물론 정수 연산 으로 제한됩니다.

  • expr작업을 사용할 때 공백을 추가해야 합니다.
  • expr논리 연산 지원

예 1:

a=`expr 1 + 2`
a=$(expr $a + 1)
  • expr의 각 변수와 연산자에는 공백이 있어야 합니다.

예 2:

a=`expr 1 > 2`; echo $a
0
  • expr은 논리 연산도 지원합니다.

6) 기원전 도구

bc은 수학적 연산을 위한 고급 유틸리티로, 이 정교한 계산에는 많은 옵션이 포함되어 있습니다. 부동 소수점 산술을 수행하고 일부 고급 기능을 사용할 수 있습니다.

예 1: 부동 소수점 계산

echo "4 * 0.5" | bc
2.0

x=10
y=`echo "$x * 0.5" | bc`
echo $x
5.0

bc작업 제어 접두사는 세미콜론으로 구분하여 허용할 수 있습니다.

예 2: 소수 자릿수 설정

echo "scale=2; 10 / 2 " | bc
5.00

소수점 이하 자릿수는 매개변수 를 통해 2로 설정 scale=2하므로 인쇄 결과는 소수점 2자리를 유지합니다.

bc다른 기지의 변환 기능을 실현할 수 있습니다.

예제 3: 16진수 변환

n=10
#二进制
echo "obase=2;$n" | bc
1010
#八进制
echo "obase=8;$n" | bc
12
#十六进制
echo "obase=16;$n" | bc
A

위의 코드는 10진수를 2진수, 8진수 및 16진수로 변환하는 방법을 보여줍니다.

그 중 obase출력 내용의 이진법을 제어하기 위해 사용되는 출력 제어가 있고, 또한 ibase입력 수의 이진법을 제어하기 위해 사용되는 입력 제어가 있다.

n=1010
#二进制转换成十进制
echo "obase=10;ibase=2;$n" | bc

**참고: 이전에 ibase설정해야 합니다 变量! **다음 철자는 모두 정확합니다.

  • echo "obase=10;ibase=2;$n" | bc
  • echo "ibase=2;$n;obase=10;" | bc

컴퓨터 읽기 명령의 특성에 따라 이것은 컴퓨터가 변수를 읽을 때 처음에 ibase입력 제어를 찾을 수 있도록 보장할 수 있습니다. 그렇지 않으면 기본적으로 십진수로 저장됩니다.

예 4: 제곱 및 제곱근 계산

echo "sqrt(100)" | bc
10
echo "2^3" | bc
8

bc에는 풍부한 수학 함수 라이브러리도 있습니다. 이러한 고급 함수를 --mathlib또는 옵션과 함께 사용하십시오.-l

예 5: 사인 및 코사인

#正弦
echo "s(3.1415926/2)" | bc --mathlib
.99999999999999964101
#余弦
echo "c(0)" | bc --mathlib
1.00000000000000000000

bc파일 작업도 가능

예 6: 파일에서 계산 완료

cat > bctest.bc << "EOF"
sqrt($a)
2^3
EOF
cat bctest.bc | bc --mathlib
10.00000000000000000000
8

참고: 이 방법은 파이프라인을 통해 파일을 bc로 전달하는 것이므로 파일에서 변수를 사용할 수 없습니다(예: sqrt($a)인식할 수 없음).

추천

출처blog.csdn.net/why1472587/article/details/128525918