
-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 ))
산술을 바꾸십시오 . 또한 더 효율적입니다.