Bash는 누락에 대해 불평합니다] 그리고 거기에 있습니다 [중복]

Bash는 누락에 대해 불평합니다] 그리고 거기에 있습니다 [중복]

Bash 스크립트에는 다음이 있습니다.

echo "status: [$status] and message: [$message]"
if [ "${status}" -eq 0 && "$message" = "ERROR" ];
then
        echo "Exit 0";
        exit 0
fi

# status: [0] message: [ERROR]

then그러나 다음 오류가 발생하고 IE에서는 논리가 exit 0실행되지 않습니다.

line 2: [: missing `]'

폐쇄성이 부족하다고 불평하는 것 같지만 ]거기에 있습니다. 내가 여기서 무엇을 놓치고 있는 걸까요?

답변1

클로저는 ]실제로 존재하지 않습니다.

당신은:

cmd1 with its args && cmd2 with its args

cmd2성공할 경우에만 실행됩니다 cmd1.

여기에 cmd1명령 [이 있으며 cmd2은 이름이 에 저장되어 있는 명령입니다 $message.

IOW, 첫 번째 명령은 다음과 같습니다.

[ "${status}" -eq 0

결론 문장이 누락되었습니다 ]. 두 번째 문장은 다음과 같습니다.

"$message" = "ERROR" ]

당신이 원하는

if [ "${status}" -eq 0 ] && [ "$message" = "ERROR" ]; then...

Korn과 유사한 셸(예: bash)에서는 명령 [[...]]대신 이 구성을 사용할 수도 있습니다 [. 이 구문은 자체 구문으로 마이크로 언어를 이해하며 연산자도 있습니다 &&.

if [[ $status -eq 0 && $message = ERROR ]]; then

그러나 [이와 대조적으로 공격자가 값을 제어할 수 있는 경우 $status이 취약점으로 인해 명령 주입 취약점이 발생한다는 점에 유의하세요.

Bash에서는 [s 연산자가 for 's와 같은 임의의 산술 표현식이 -eq아닌 10진수 정수만 허용하기 때문에 문제가 없습니다 .[[...]]-eq

bash-5.0$ status='a[$(echo>&2 Gotcha)]'
bash-5.0$ [[ $status -eq 0 ]]
Gotcha

이러한 문제는 (( status == 0 ))C와 유사한 산술 표현식을 평가하는 연산자에도 영향을 미칩니다(ksh에서도 발생).

bash-5.0$ (( status == 0 ))
Gotcha

¹ 이러한 산술 표현식에는 a 도 있지만 산술에만 사용되므로 &&여기서는 사용할 수 없으므로 문자열 비교를 수행할 수 없습니다. 가 필요합니다 .((...))if (( status == 0 )) && [ "$message" = ERROR ]

답변2

직면하고 있는 문제는 [테스트 구성을 사용하고 있다는 것입니다. 이 구성은 korn-shell/bash-style [[-operator 처럼 인수에서 부울 연산자를 지원하지 않으므로 [테스트만 선언할 수 있습니다 ].

다음과 같이 두 조건을 연결할 수 있습니다.&&- 쉘 레벨 연결별도의 테스트로, 즉

if [ "${status}" -eq 0 ] && [ "$message" = "ERROR" ];

아니면 더 편리한 [[ ... ]]- 연산자를 대신 사용하세요.

if [[ "${status}" -eq 0 && "$message" = "ERROR" ]];

관련 정보