expr, $ (()), (())

셸 스크립트에서 expr $a*$b를 다음으로 대체 할 수 있습니다. $(($a+$b)).

그러나 (($a+$b)) 만 사용하지 않는 이유는 모든 리소스에서 (())가 정수 계산을위한 것이라고 기록되어 있기 때문입니다.

그래서 정수 값 대신 변수가있을 때 $(())를 사용합니까? 변수가 float 값을받을 수있을 때 $(()) 대신 무엇을 사용해야합니까?

댓글

답변

  1. 산술의 경우 expr는 구식입니다. 사용하지 마세요. *

  2. $((...))((...))는 매우 유사합니다. 둘 다 정수 계산 만 수행합니다. 차이점은 $((...))는 계산 결과를 반환하고 ((...))는 반환하지 않는다는 것입니다. 따라서 $((...))echo 문에서 유용합니다.

    $ a=2; b=3; echo $((a*b)) 6 

    ((...))는 변수를 할당하거나 종료 코드를 설정할 때 유용합니다.

    $ a=3; b=3; ((a==b)) && echo yes yes 
  3. 플로팅을 원하는 경우 포인트 계산은 bc 또는 awk 사용 :

    $ echo "4.7/3.14" | bc -l 1.49681528662420382165 $ awk "BEGIN{print 4.7/3.14}" 1.49682 

* 제외로, expr는 glob이 충분하지 않고 정규 표현식을 처리하는 데 POSIX 메소드가 필요한 경우 문자열 처리에 유용합니다.

댓글

  • expr이 구식이면 expr 텍스트 대신 무엇을 사용해야합니까? : '. * '
  • s가 셸 변수 인 경우 길이는 ${#s}
  • $ {#}는 여러 인수를 의미하고 $ (# s}는 변수의 여러 문자를 의미합니까?
  • 예. ' 맞습니다.
  • @Stranger expr STRING : REGEX의 많은 사용은 . expr는 REGEX가 쉘 와일드 카드로 ' 표현 될 수없는 경우에만 유용합니다.

Answer

expr은 오래되었지만 제가 생각할 수있는 제한된 용도가 하나 있습니다. 문자열을 검색하고 싶다고 가정 해보십시오. grep으로 POSIX를 유지하려면 파이프를 사용해야합니다.

if echo november | grep nov then : do something fi 

expr은 파이프없이이를 수행 할 수 있습니다.

if expr november : nov then : do something fi 

유일한 캐치는 expr이 고정 된 문자열로 작동하므로 처음부터 일치 시키려면 REGEXP를 변경해야합니다.

if expr november : ".*ber" then : do something fi 

(( ))와 관련하여이 구성은 POSIX가 아니므로 피해야합니다.

p>

$(( ))의 경우 달러 기호를 포함 할 필요가 없습니다.

$ fo=1 $ go=2 $ echo $((fo + go)) 3 

댓글

  • expr STRING : REGEX의 다양한 용도는 case STRING in PATTERN)로 작성할 수 있습니다. expr는 REGEX가 쉘 와일드 카드로 ' 표현 될 수없는 경우에만 유용합니다.

Answer

다음 프로그램은 거의 동일하며 실제로 다르지 않은 것 같습니다.하지만 사실이 아닙니다.

#!/bin/bash s=-1000 for (( i=0; i<1000000; i++ )), do s=$((s+1)) echo $s 

이를 구현하는 올바른 방법입니다. s + 1 표현식은 쉘에 의해 평가되며 변수에 할당 될 수 있습니다.

#!/bin/bash s=-1000 for (( i=0; i<1000000; i++ )), do s=`expr $s+1` echo $s 

여기서 표현식은”쉘 내장이 아니라 외부 Unix 프로그램 인 expr 프로그램에 의해 계산됩니다. 따라서 단순히 1과 s를 추가하는 대신 프로그램을 시작하고 출력을 읽고 변수에 기록해야합니다. 프로그램을 시작하려면 많은 리소스와 많은 시간이 필요합니다. 그리고이 프로그램은 1000000 번 실행됩니다. 따라서 프로그램은 이전보다 훨씬 느릴 것입니다. 그럼에도 불구하고 코드는 올바르게 작동합니다.

#!/bin/bash -e s=-1000 for (( i=0; i<1000000; i++ )), do ((s=s+1)) echo $s 

-e 플래그가 설정되어 있지 않으면 프로그램도 올바르게 작동합니다. 그러나 -e가 설정되면 s = -1 및 ((s = s + 1))이 계산됩니다. 표현식 s = s + 1은 0으로 평가되고 ((0))의 종료 코드는> 0이며 셸에서 오류로 해석되고 쉘이 프로그램을 종료합니다.

-e 플래그를 설정하는 이유는 이것이 오류 처리의 가장 간단한 방법이기 때문입니다. 오류가 발생하면 중지합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다