bash -e는 let 또는 expr이 0으로 평가 될 때 종료됩니다.

-e를 설정하는 bash 스크립트가 있으므로 스크립트가 모든 종료 상태에서 종료됩니다! = 0 .

나는 변수에 할당 된 기본적인 쉘 산술을 수행하려고합니다. 때로는 표현식이 0이되어 let 또는 expr 명령의 종료 상태가 “1”이됩니다.

예 :

#!/bin/bash -ex echo "Test 1" Z=`expr 1 - 1` || true echo "Z will print" let "A=4 - 4" echo "A WILL NEVER PRINT $A" Y=`expr 1 - 1` echo "Y WILL NEVER PRINT $Y" X=$(expr 2 - 2) echo "X WILL NEVER PRINT $X" 

출력은 다음과 같습니다.

$ ./test_error.sh + echo "Test 1" Test 1 ++ expr 1 - 1 + Z=0 + true + echo "Z will print" Z will print + let "A=4 - 4" 

My 질문은 기본 산술 0이 아닌 실제 종료 오류에서 스크립트가 실패하도록 허용하는 관용적 bash 스크립팅 방법입니다. 이러한 모든 표현식에 다음과 같은 접미사를 붙일 수 있습니다.

A=`expr $C - $D` || true 

하지만 그것은 엉망인 것 같습니다.

답변

expr는 산술입니다. 오래 전부터 사용되지 않았습니다. 이제 쉘에는 $((…)) 구문 (POSIX) 또는 let 내장 (ksh / bash / zsh) 또는 ((…)) 구문 (ksh / bash / zsh).

let((…)) 마지막으로 평가 된 표현식이 0이면 1 (실패 상태 코드)을 반환합니다. 이로 인해 스크립트가 set -e 아래에서 종료되지 않도록하려면 0을 반환하지 않는 마지막 표현식, 예 :

let "a = 2 - 2" 1 ((a = 2 - 2, 1)) 

또는 || true 관용구를 사용합니다.

((a = 2 - 2)) || true 

또는 $((…)) 내부에서 산술을 수행하고 외부에서 할당을 수행합니다. 할당은 값에 마지막 명령 대체 상태를 반환하거나 명령 대체가없는 경우 0을 반환하므로 안전합니다. 이것은 모든 POSIX 쉘 (예 : 대시)에서 작업 할 수있는 추가 이점이 있습니다.

a=$((2 - 2)) 

답변

같은 문제 . tl; dr :

마지막 ARG [of let]이 0으로 평가되면 let은 1을, 그렇지 않으면 0을 반환합니다. .

답변

$(( $C - $D )) 대신 산술을 사용하세요. 더 효율적입니다.

댓글

  • ?

Answer

이 구문은 저에게 적합합니다.

a=$((b + c)) 

답글 남기기

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