let, expr 및 $ []의 차이점


23

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

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

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

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

답변:


25

이 모든 것은 산술을 다루지 만 다른 방식으로 변수는 다른 수단을 통해 만들어집니다. 이 중 일부는 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그리고 $[...]수 없습니다.


1
((...))사실에서 할당에 사용할 수 있습니다 bash, ksh그리고 zsh: n=10; ((n+=10)); echo $n(20)와 인쇄 ((x=1)); echo $x1. 인쇄
알렉세이 마구 라

1
@Alexej 감사합니다. 답변이 업데이트 됨, 해당 부분이 제거됨
Sergiy Kolodyazhnyy

11
  • let명령은 산술 평가를 수행 하며 쉘 내장입니다.

    • 이 명령을 실행하면 아무것도 얻지 못합니다 (평가 만 가능).

      let 1+2
  • $(( ))산술 확장 을 수행하는 데 사용됩니다 : 여기를 읽으십시오

    • 이것을 실행하면 (확장 때문에) 오류가 발생합니다.

      $((1+2))
  • $[ ] 산술 확장에 대한 이전 구문입니다.

    구식 $ [expression]은 더 이상 사용되지 않으며 bash에서 곧 제거 될 것입니다. 배쉬 맨 페이지

  • expr 명령 대체 내에서 산술 확장을 수행하려는 경우 이진 명령을 사용할 수 있습니다.

    echo $(expr 1 + 2) 
    echo `expr 1 + 2`

4

위의 답변 중 일부는 구체적으로 언급 ksh93하므로 부동 소수점 수학을 수행 할 수 있다는 점에 주목할 가치가 있습니다.

$ print $((1.0/3)) 
0.333333333333333333

다음과 같이 printf를 사용하여 출력의 정밀도를 제어 할 수 있습니다.

$ printf "%.4f\n" $((1.0/3))
0.3333

위와 같이 하나 이상의 인수를 부동 소수점 숫자로 지정해야합니다. 둘 다 정수로 지정되면 정수 수학 만 수행됩니다. 예 :

$ print $((1/3))  
0

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


bash 스크립트에서 분수 / 소수점을 사용할 수 있습니까?에 대한 답변을 게시하고 싶을 수도 있습니다 . 제목에도 불구하고, 나는 상황이 다른 Bourne의 스타일 쉘 내가 게시 된 이유입니다, 관련이있는 것이 분명하게 생각 대답을 . 나 보다 서로 (일반적으로) 비슷하고 유사하기 때문에 그 질문에 대한 기반 답변이 매우 유용 할 것 같습니다 . zshkshbashzshkh93
Eliah Kagan

1

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

let x=1+2
echo x=$x

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.