서브쉘 없이 여러 조건이 있으면 배싱하지 않나요?

서브쉘 없이 여러 조건이 있으면 배싱하지 않나요?

쉘 if 문에서 여러 조건을 결합하고 조합을 무효화하고 싶습니다. 간단한 조건 조합에 대해 다음과 같은 작업 코드가 있습니다.

if [ -f file1 ] && [ -f file2 ] && [ -f file3 ] ; then
  # do stuff with the files
fi

이것은 훌륭하게 작동합니다. 이를 부정하려면 다음 작업 코드를 사용할 수 있습니다.

if ! ( [ -f file1 ] && [ -f file2 ] && [ -f file3 ] ) ; then
  echo "Error: You done goofed."
  exit 1
fi
# do stuff with the files

이것은 예상대로 작동합니다. 그러나 나는 괄호가 실제로 무엇을 하는지 전혀 모른다는 것을 발견했습니다. 나생각하다그룹화에만 사용하지만 실제로 하위 쉘이 생성됩니까? (어떻게 알 수 있습니까?) 그렇다면 하위 쉘을 생성하지 않고 조건을 그룹화하는 방법이 있습니까?

답변1

{ list;}대신 다음을 사용해야 합니다 (list).

if ! { [ -f file1 ] && [ -f file2 ] && [ -f file3 ]; }; then
  : do something
fi

둘 다그룹화 명령, 그러나 { list;}현재 쉘 환경에서 명령을 실행합니다.

목록과 역방향 단어를 구분하려면 ;in 이 필요하며 다른 구분 기호도 사용할 수 있습니다. 다음 공백(또는 기타 구분 기호) 도 필요합니다.{ list;}}{

답변2

도착하다가지고 다닐 수 있는셸에서 복잡한 조건을 무효화하려면 다음을 적용해야 합니다.드모건의 법칙[부정을 호출 에 끝까지 밀어 넣습니다 ...

if [ ! -f file1 ] || [ ! -f file2 ] || [ ! -f file3 ]
then
    # do stuff
fi

then :; else...또는 ...을 사용해야 합니다 .

if [ -f file1 ] && [ -f file2 ] && [ -f file3 ]
then :
else
  # do stuff
fi

if ! command휴대용도 아닙니다 [[.

완전한 이식성이 필요하지 않은 경우,쉘 스크립트를 작성하지 마십시오. 당신은 실제로/usr/bin/perl무작위로 선택된 Unix에서는 당신보다 더 많은 사람들을 찾을 가능성이 있습니다 bash.

답변3

test기능을 사용하면 원하는 것을 정확하게 얻을 수 있습니다. 매뉴얼 페이지에서 test:

 ! expression  True if expression is false.
 expression1 -a expression2
               True if both expression1 and expression2 are true.
 expression1 -o expression2
               True if either expression1 or expression2 are true.
 (expression)  True if expression is true.

따라서 상황은 다음과 같을 수 있습니다.

if [ -f file1 -a -f file2 -a -f file3 ] ; then
    # do stuff with the files
fi

부정하려면 이스케이프된 대괄호를 사용하세요.

if [ ! \( -f file1 -a -f file2 -a -f file3 \) ] ; then
    echo "Error: You done goofed."
    exit 1
fi
# do stuff with the files

답변4

이것은 귀하의 주요 질문에 대한 완전한 답변은 아니지만 귀하의 의견에서 귀하가 복합 테스트(읽을 수 있는 파일)를 언급했다는 것을 알았습니다.

if [ -f file1 ] && [ -r file1 ] && [ -f file2 ] && [ -r file2 ] && [ -f file3 ] && [ -r file3 ]

예를 들어, 쉘 함수를 정의하여 이를 좀 더 강화할 수 있습니다.

readable_file()
{
    [ -f "$1" ]  &&  [ -r "$1" ]
}

[ $# = 1 ]취향에 맞게 (예: )에 오류 처리를 추가합니다 . 위의 첫 번째 진술은 if이제 다음과 같이 요약될 수 있습니다.

if readable_file file1  &&  readable_file file2  &&  readable_file file3

함수 이름을 줄여서 더 줄일 수 있습니다. 마찬가지로 함수에 부정을 정의 not_readable_file()(또는 축약)하고 포함할 수 있습니다.nrf

관련 정보