답변:
이 모든 것은 산술을 다루지 만 다른 방식으로 변수는 다른 수단을 통해 만들어집니다. 이 중 일부는 bash껍질 에만 해당되는 반면 다른 것은 그렇지 않습니다.
$((...))를 산술 확장 이라고 하며 이는 쉘 bash및 ksh쉘의 전형입니다 . 이것은 간단한 정수 산술을 할 수 있지만 부동 소수점은 없습니다. 에서이 같은 식의 결과는, 표현을 대체 echo $((1+1))될 것입니다echo 2((...))산술 평가 라고 하며 일부 if ((...)); then또는 while ((...)) ; do명령문 으로 사용할 수 있습니다 . 산술 확장 확장은 연산 $((..))의 출력을 대체하며 변수를 할당하는 데 사용할 i=$((i+1))수 있지만 조건문에는 사용할 수 없습니다.$[...] 더 이상 사용되지 않는 산술 확장에 대한 이전 구문입니다. 도 참조하십시오 . 이것은 오래된 bash스크립트가 깨지지 않도록 유지되었을 것 입니다. 이것은에서 작동하지 않았 ksh93으므로이 구문은 bash에만 해당됩니다. 참고 : 공백은 여기서 매우 중요합니다. $[1+1]와 같은 것들을 혼동하지 마십시오 [ $a -eq $b ]. [공백은로 알려져 test명령, 당신은 일반적으로 의사 결정 부분을 참조하십시오. 그것은 행동과 목적이 매우 다릅니다.let간단한 산술 평가로 변수를 만들 수 있는 bash및 ksh키워드입니다. 문자열을 할당하려고 let a="hello world"하면 구문 오류가 발생합니다. 에서 작동 bash하고 ksh93.$(...)문자 그대로 명령의 출력을 가져 와서 변수에 할당하는 명령 대체입니다. 여기에서 귀하의 명령은 expr과 같은 위치 인수를 취 expr arg1 arg2 arg3하므로 공백이 중요합니다. 정수 산술을위한 작은 명령 줄 계산기와 더불어 사실 / 거짓 및 정규 표현식 유형과 비슷합니다. 이것은 쉘 중립 명령입니다.또한 연산 확장과 명령 치환에 의해 지정되는 것을 주목할 필요가 POSIX 표준 동안, let그리고 $[...]수 없습니다.
let명령은 산술 평가를 수행 하며 쉘 내장입니다.
이 명령을 실행하면 아무것도 얻지 못합니다 (평가 만 가능).
let 1+2$(( ))산술 확장 을 수행하는 데 사용됩니다 : 여기를 읽으십시오
이것을 실행하면 (확장 때문에) 오류가 발생합니다.
$((1+2))$[ ] 산술 확장에 대한 이전 구문입니다.
구식 $ [expression]은 더 이상 사용되지 않으며 bash에서 곧 제거 될 것입니다. 배쉬 맨 페이지
expr 명령 대체 내에서 산술 확장을 수행하려는 경우 이진 명령을 사용할 수 있습니다.
echo $(expr 1 + 2)
echo `expr 1 + 2`위의 답변 중 일부는 구체적으로 언급 ksh93하므로 부동 소수점 수학을 수행 할 수 있다는 점에 주목할 가치가 있습니다.
$ print $((1.0/3))
0.333333333333333333
다음과 같이 printf를 사용하여 출력의 정밀도를 제어 할 수 있습니다.
$ printf "%.4f\n" $((1.0/3))
0.3333
위와 같이 하나 이상의 인수를 부동 소수점 숫자로 지정해야합니다. 둘 다 정수로 지정되면 정수 수학 만 수행됩니다. 예 :
$ print $((1/3))
0
이것은 외부 명령 호출을 피할 수 있으므로 쉘 스크립트에서 부동 소수점 수학이 필요할 때 유용합니다.
zshkshbashzshkh93
((...))사실에서 할당에 사용할 수 있습니다bash,ksh그리고zsh:n=10; ((n+=10)); echo $n(20)와 인쇄((x=1)); echo $x1. 인쇄