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" ]];