셸 스크립트에서 expr $a*$b
를 다음으로 대체 할 수 있습니다. $(($a+$b))
.
그러나 (($a+$b))
만 사용하지 않는 이유는 모든 리소스에서 (())
가 정수 계산을위한 것이라고 기록되어 있기 때문입니다.
그래서 정수 값 대신 변수가있을 때 $(())
를 사용합니까? 변수가 float 값을받을 수있을 때 $(())
대신 무엇을 사용해야합니까?
댓글
- 참조 unix.stackexchange.com/questions/149823/ …
답변
-
산술의 경우
expr
는 구식입니다. 사용하지 마세요. * -
$((...))
및((...))
는 매우 유사합니다. 둘 다 정수 계산 만 수행합니다. 차이점은$((...))
는 계산 결과를 반환하고((...))
는 반환하지 않는다는 것입니다. 따라서$((...))
는echo
문에서 유용합니다.$ a=2; b=3; echo $((a*b)) 6
((...))
는 변수를 할당하거나 종료 코드를 설정할 때 유용합니다.$ a=3; b=3; ((a==b)) && echo yes yes
-
플로팅을 원하는 경우 포인트 계산은
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}
li입니다. > - $ {#}는 여러 인수를 의미하고 $ (# 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 플래그를 설정하는 이유는 이것이 오류 처리의 가장 간단한 방법이기 때문입니다. 오류가 발생하면 중지합니다.