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


19

-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

그러나 그것은 해키처럼 보인다.

답변:


16

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))

1

$(( $C - $D ))당신의 산술에 대신 사용하십시오 . 더 효율적입니다.


말하는 것보다 더 효율적인 이유는 무엇입니까 (( A = $C - $D ))?
감독

1

나는 같은 문제 가 있었다 . tl; dr :

let의 마지막 ARG가 0으로 평가되면 let은 1을 리턴합니다. 그렇지 않으면 0을 반환합니다.


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