어떤 비교를 하고 있는지 잘 모르겠습니다.
if [ "$exit_status" -eq 0 ];then
#some statements
fi
변수가 exit_status
0과 비교하여 문자열이 되도록 숫자나 따옴표를 비교하는 올바른 방법입니까? 어떤 경우에는 이것이 실패할지 모르겠습니다.
답변1
예, 맞습니다.
셸의 따옴표는 다른 언어의 따옴표와 다른 용도로 사용됩니다. 바라보다이 답변자세한 내용은.
셸에서는 따옴표를 사용하여 셸이 특정 문자를 특별히 처리하지 못하게 하고 특정 유형의 확장(예: 이 경우 변수 확장)에 대해 특정 작업을 수행하지 못하도록 합니다.
일반적으로 이 경우 명령의 한 인수, 즉 해당 변수의 내용 "$exit_status"
으로 확장 하려고 하므로 따옴표가 필요합니다.[
답변2
[ "$exit_status" -eq 0 ]
$exit_status에 숫자만 포함된 경우에도 마찬가지이며, 따옴표를 제거할 수도 있습니다(IFS에 숫자가 포함되어 있지 않은 경우).
x가 비어 있거나 설정되지 않은 경우 오류가 발생 [ "$x" -eq 6 ]
하지만 다음은 [[ "$x" -eq 6 ]]
그렇지 않습니다.
$ x=; [ "$x" -eq 6 ]
-bash: [: : integer expression expected
$ unset x; [ "$x" -eq 6 ]
-bash: [: : integer expression expected
$ x=; [[ "$x" -eq 6 ]]
$ unset x; [[ "$x" -eq 6 ]]
$
산술 연산자는 공백을 제거합니다.
$ [ '6 ' -eq $'\n\t6' ]; echo $?
0
[[ 안의 산술 연산자의 피연산자는 산술 표현식이므로 example [[ 4 -eq 2+2 ]]
은 참입니다. 0으로 시작하는 숫자는 8진수로 처리됩니다.
$ [[ 010 -eq 8 ]]; echo $?
0
$ [ 010 -eq 8 ]; echo $?
1
나는 심지어 정수를 비교하기 위해 = / ==를 꽤 자주 사용합니다. = 및 ==는 bash의 [[ 및 [와 동일합니다. == 및 [[는 POSIX에 의해 정의되지 않습니다.
[[ 내부적으로 단어 분리 및 경로 이름 확장을 수행하지 않습니다. [[ $x = $y ]]
y를 패턴으로 취급하지만 [[ $x = "$y" ]]
y를 문자 그대로 취급합니다.
$ x=44; y='4*'
$ [[ $x = $y ]]; echo $?
0
$ [[ $x = "$y" ]]; echo $?
1
답변3
그러나 숫자를 인용하는 것은 별로 쓸모가 없습니다. 인수 값이 숫자이면 따옴표는 아무 것도 변경하지 않습니다. 그렇지 않으면 if는 어쨌든 실패합니다. 음, 모든 경우에 해당되는 것은 아닙니다.
exit_status="a = a -o 0"; [ "$exit_status" -eq 0 ] # returns false
exit_status="a = a -o 0"; [ $exit_status -eq 0 ] # returns true
[
bash 내장이지만 여전히 단순한 명령 [[
이지만 명령줄 구문 분석을 변경하는 복합 명령이기 때문입니다 .