bash if 문에서 조건부 스크립트 연산자 -a -o를 중첩하는 방법

bash if 문에서 조건부 스크립트 연산자 -a -o를 중첩하는 방법

if 문에서 -a 및 -o 스크립트 연산자를 결합하려면 어떻게 해야 합니까? 예를 들어:

if [ ( -e file.txt -a -r file.txt ) -o ( -e file2.txt -a -r file2.txt ) ]; then .... fi

내가 이런 일을 할 수 있을까? 이제 이 프로그램을 실행하려고 하면 오류가 발생합니다.

답변1

이중 괄호를 사용하십시오(참조:따옴표가 없는 공백 매개변수 확장이 이중 괄호 "[[" 내에서는 작동하지만 단일 괄호 "[" 내에서는 작동하지 않는 이유는 무엇입니까?). 및 테스트/단일 괄호 조건 연산자 대신 &&및 이중 괄호 조건 연산자를 사용하십시오 . 이것은 bash, ksh 및 zsh에서도 작동하지만 일반 sh에서는 작동하지 않습니다.||-a-o

if [[ ( -e file.txt && -r file.txt ) || ( -e file2.txt && -r file2.txt ) ]]; then

또는 단일 대괄호의 경우 대괄호 내부에 및 테스트 연산자를 사용하는 대신 대괄호 외부에 및 셸 연산자를 [사용하여 단일 검사를 사용 하고 그룹화합니다(참조&&||-a-o{ … }터미널에서 괄호와 중괄호의 차이점은 무엇입니까?). 이것은 모든 sh 스타일 쉘에서 작동합니다.

if { [ -e file.txt ] && [ -r file.txt ]; } ||
   { [ -e file2.txt ] && [ -r file2.txt ]; }
then …

또는 단일 대괄호 안에 \(\)(또는 괄호를 참조하는 다른 방법)을 사용할 수 있습니다(다시 참조).따옴표가 없는 공백 매개변수 확장이 이중 괄호 "[[" 내에서는 작동하지만 단일 괄호 "[" 내에서는 작동하지 않는 이유는 무엇입니까?설명을 위해). 그러나 파일 이름이 테스트 연산자( (, , , ...)처럼 보이는 경우 조건이 잘못 구문 분석될 수 있습니다.=-e

관련 정보