여러 조건이 포함된 if 문을 작성하는 방법

여러 조건이 포함된 if 문을 작성하는 방법
for filename in *
do
    if [ "$filename" -ne even ] && [ "$filename" -ne odd ]
    then
        echo "$filename"
    fi
done

위는 현재 저장소의 파일을 확인하고 "even" 및 "odd" 이외의 이름을 가진 파일을 출력하는 간단한 쉘 스크립트입니다.

작동하지 않습니다

답변1

비교 연산자 -ne산수연산자를 테스트합니다. 즉, 정수만 비교합니다.

i=7

if [ "$i" -ne 6 ] && [ "$i" -ne 8 ]; then
   echo 'i is neither 6 nor 8'
fi

비교하다불평등의 경우 다음을 사용하십시오 !=.

if [ "$filename" != 'even' ] && [ "$filename" != 'odd' ]; then
    printf '"%s" is neither of the strings "even" or "odd"\n' "$filename"
fi

또는 다음을 사용하십시오 case.

case "$filename" in
    even|odd)
        # the filename is "even" or "odd"
        ;;
           *)
        # the filename is neither "even" nor "odd"
        printf '%s\n' "$filename"
esac

또한 *일반 파일 이름뿐만 아니라 현재 디렉터리의 모든 이름과 일치합니다. 루프에서 일반 파일만 처리하려면 다음을 사용하세요.

for name in *; do
    if [ ! -f "$name" ] || [ -L "$name" ]; then continue; fi

    # other code here using "$name"
done

continue문은 루프의 다음 반복으로 점프합니다. -f file조사하다정기적인문서뒤쪽에심볼릭 링크 확인을 통해 다음 유형의 파일을 원하는 경우심볼릭 링크일반 파일을 가리키는지 여부에 관계없이 제외하려면 추가 || [ -L "$name" ].

답변2

줄을 if다음으로 변경합니다.

if [ "$filename" != even ] && [ "$filename" != odd ]

bash셸 에서 전체 스크립트(for에서 포함까지 ) done이는 다음과 같이 단순화될 수 있습니다.

GLOBIGNORE=even:odd ; printf "%s\n" *

또 다른 bash방법:

shopt -s extglob  # only needs to be done once, if not set already.
printf "%s\n" !(odd|even)

답변3

또는 -a를 사용한 괄호 쌍

for filename in *
do
     if [ "$filename" != even -a "$filename" != "odd" ]
     then
         echo "$filename"
     fi
done

또는

for filename in * 
do 
    case "$filename" in  
        (even|odd) ;; 
            *) echo "$filename" ;; 
    esac
done

답변4

find -maxdepth 1 -not -name even -not -name odd 

아마도 가장 짧은 솔루션일 것입니다. 비록 긴 "-maxlength 1"이 있더라도 디렉토리 리프에서는 이를 생략할 수 있습니다.

각 파일에 대해 프로그램을 호출하는 것은 매우 간단합니다.

find -maxdepth 1 -not -name even -not -name odd -exec wc {} ";" 

(wc에서 볼 수 있듯이 중괄호를 사용하여 파일 이름을 예상합니다. 이는 GNU-find에 의존합니다.)

관련 정보