`-a` 또는`-o` 연산자를`[`와 함께 사용하지 마십시오


11

스테판 샤 젤라 스는 다음과 같이 썼다.

같은 몇 가지 규칙

  • 항상 변수를 인용
  • -aor -o연산자를 사용하지 마십시오 (여러 [명령 &&||셸 연산자 사용)

확인 [POSIX 쉘과 신뢰성.

왜 " -a또는 -o연산자를 사용하지 않습니까?"

"여러 [명령 &&||쉘 연산자 사용"을 어떻게 할 수 있습니까?

답변:


13

왜 " -a또는 -o연산자를 사용하지 않습니까?"

모호 할 수 있기 때문에 POSIX 호환이 아닙니다 .

-a 및 -o 2 진 1 차 및 '('및 ')'연산자를 지정하는 XSI 확장은 더 이상 사용되지 않는 것으로 표시되었습니다. (이를 사용하는 많은 표현식은 평가할 특정 표현식에 따라 문법에 의해 모호하게 정의됩니다.) 이러한 표현식을 사용하는 스크립트는 아래 주어진 형식으로 변환되어야합니다. 많은 구현이 이러한 노후화 된 형식을 계속 지원하지만, 스크립트는 이들 및 다른 기본 및 연산자와 혼동 될 수있는 사용자 제공 입력을 처리 할 때 매우주의해야합니다. 애플리케이션 개발자가 스크립트에 입력을 생성하는 모든 경우를 알고 있지 않으면 다음과 같은 호출이 있습니다.

test "$1" -a "$2"

다음과 같이 작성해야합니다.

test "$1" && test "$2"

"여러 [명령 &&||쉘 연산자 사용"을 어떻게 할 수 있습니까?

상기 연산자를 사용하여 다수의 테스트를 수행하고 연결함으로써; 예를 들면 다음과 같습니다.

[ 0 -eq 0 -a \( 0 -eq 1 -o 1 -eq 1 \) ]

동등한 것으로 다시 쓸 수 있습니다 :

[ 0 -eq 0 ] && ([ 0 -eq 1 ] || [ 1 -eq 1 ])

또는 더 나은 :

[ 0 -eq 0 ] && { [ 0 -eq 1 ] || [ 1 -eq 1 ]; }

감사. (1) " '('및 ')'연산자는 더 이상 사용되지 않습니다". 인가 ()그룹 명령하는 사업자? 더 이상 사용되지 않으면 대체품은 무엇입니까? (2) 또는 test "$1" -a "$2"로 대체 해야합니까 ? 우리는 필요하지 않습니까? test "$1" && test "$2"((test "$1" && test "$2"))((..))
Tim

@Tim 업데이트를 참조하십시오. (1) 예 - 당신이 사용할 수있는 (){}교체 등. (2) 첫 번째; (())는 산술 확장에 사용됩니다. 여기서 테스트 체인의 종료 상태를 테스트하려고하므로 테스트를 서브 쉘 ()또는 현재 쉘로 그룹화하십시오 {}.
kos

감사. 내 질문이이 게시물을 넘어갈 수 있다고 생각합니다. 그래서 나는 그들을 새로운 게시물에 게시합니다.
Tim

1
사용하는 유일한 이유 @ 팀 ()사용중인 경우 운영자입니다 -a-o. 후자는 더 이상 사용되지 않으므로 전자는 더 이상 필요하지 않습니다.
Barmar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.