let, expr 및 $ []의 차이점 무엇입니까? 내가 지금까지 알아 낸 것에서 expr은 실제

정확히 차이점이 무엇인지 알고 싶습니다.

a=$[1+1]
a=$((1+1))
let a=1+1
a=$(expr 1 + 1 )

4는 모두 변수 a에 2를 할당하지만 차이점은 무엇입니까?

내가 지금까지 알아 낸 것에서 expr은 실제 쉘 내장이 아니기 때문에 expr이 느리다는 것입니다. 그러나 그 이상은 없습니다.



답변

이 모든 것은 산술을 다루지 만 다른 방식으로 변수는 다른 수단을 통해 만들어집니다. 이 중 일부는 bash껍질 에만 해당되는 반면 다른 것은 그렇지 않습니다.

  • $((...))산술 확장 이라고 하며 이는 쉘 bashksh쉘의 전형입니다 . 이것은 간단한 정수 산술을 할 수 있지만 부동 소수점은 없습니다. 에서이 같은 식의 결과는, 표현을 대체 echo $((1+1))될 것입니다echo 2
  • ((...))산술 평가 라고 하며 일부 if ((...)); then또는 while ((...)) ; do명령문 으로 사용할 수 있습니다 . 산술 확장 확장은 연산 $((..))의 출력을 대체하며 변수를 할당하는 데 사용할 i=$((i+1))수 있지만 조건문에는 사용할 수 없습니다.
  • $[...] 더 이상 사용되지 않는 산술 확장에 대한 이전 구문입니다. 도 참조하십시오 . 이것은 오래된 bash스크립트가 깨지지 않도록 유지되었을 것 입니다. 이것은에서 작동하지 않았 ksh93으므로이 구문은 bash에만 해당됩니다. 참고 : 공백은 여기서 매우 중요합니다. $[1+1]와 같은 것들을 혼동하지 마십시오 [ $a -eq $b ]. [공백은로 알려져 test명령, 당신은 일반적으로 의사 결정 부분을 참조하십시오. 그것은 행동과 목적이 매우 다릅니다.
  • let간단한 산술 평가로 변수를 만들 수 있는 bashksh키워드입니다. 문자열을 할당하려고 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

이것은 외부 명령 호출을 피할 수 있으므로 쉘 스크립트에서 부동 소수점 수학이 필요할 때 유용합니다.


답변

letcron에서는 작동하지 않습니다. 나는 그것이 let자체 환경 을 가지고 있기 때문이라고 생각 합니다. $((...))POSIX이므로 사용하십시오 . 예를 들어

let x=1+2
echo x=$x

cron에서는 “x =”이지만 쉘에서 실행될 때 “x = 3″이됩니다.

x=$((1+2))
echo x=$x

모든 경우에 “x = 3″이됩니다.


답변