쉘 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