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

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'

내 질문은 0과 같은 기본 산술에서 실패하는 대신 스크립트가 실제 종료 오류로 실패하도록 허용하는 bash 스크립트를 작성하는 관용적 방법이 무엇인지입니다. 다음 표현 모두에 접미사를 붙일 수 있습니다.

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

그러나 이것은 이상한 것 같습니다.

답변1

연산 에는 사용하지 마십시오 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 셸(예: dash)에서 작업할 수 있다는 이점이 있습니다.

a=$((2 - 2))

답변2

나는 가지고있다같은 문제. 간단히 말해서:

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

답변3

이 구문은 나에게 효과적입니다.

a=$((b + c))

답변4

$(( C - D ))산술을 바꾸십시오 . 또한 더 효율적입니다.

관련 정보