여러 조건에서 "if" 명령을 사용하는 방법은 무엇입니까?

여러 조건에서 "if" 명령을 사용하는 방법은 무엇입니까?

어떻게 해야 하나요?

if [ -f town-*.swf ]
then
mkdir towns
fi

이는 존재 하는지 확인 town-*.swf하지만 다른 것을 찾는 데도 필요하므로 city-*.swf다음과 같은 것이 필요합니다.

if [ -f town-*.swf, city-*.swf ]
then
mkdir towns
fi

답변1

POSIXly, 당신은 사용할 수 있습니다ls

if ls town-*.swf >/dev/null 2>&1 &&
   ls city-*.swf >/dev/null 2>&1 
then
  mkdir towns
fi

조건이 다음과 같은 경우에는 더 짧습니다.

if ls town-*.swf city-*.swf >/dev/null 2>&1

쉘이 지원하더라도버팀대 확장:

if ls {town,city}-*.swf >/dev/null 2>&1

답변2

if stat -t city-*.swf >/dev/null 2>&1
then
    if stat -t town-*.swf >/dev/null 2>&1
    then
       mkdir towns
    fi
fi

사용자 uwe가 주석에서 지적했듯이 이전 명령은 와일드카드 확장을 방지합니다. 하지만 이 새 버전은 작동할 것입니다.

루프 가 필요한 경우 if스크립트를 다음과 같이 수정할 수 있습니다.

if stat -t city-*.swf >/dev/null 2>&1 && stat -t town-*.swf >/dev/null 2>&1
then
     mkdir towns
fi

and 조건 대신 or 조건을 지정해야 하는 경우에는 &&로 바꿀 수 있습니다 ||.

시험

ls
city-1.swf  city-2.swf  city-3.swf  city-4.swf  city-5.swf  sc.sh  
town-1.swf  town-2.swf  town-3.swf  town-4.swf  town-5.swf

이제 이름이 지정된 스크립트를 실행 sc.sh하면 볼 수 있습니다.도시디렉터리가 성공적으로 생성되었습니다.

인용하다

https://stackoverflow.com/questions/2937407/test-whether-a-glob-has-any-matches-in-bash

답변3

대부분의 경우 명령은 test ( [ )연산자 -a-o

EXPR1 -a EXPR2둘 다 사실이라면식 1그리고식 2그건 진실이야.
EXPR1 -o EXPR2있다면 참식 1또는식 2그건 진실이야.

그러나 가능한 여러 줄의 경우에는 조건부로 실행할 수 있는 명령을 사용해야 합니다(예 ls: )

ls {town,city}-*.swf &>/dev/null && mkdir town

사실을 활용할 수 있습니다.와일드카드대체 항목이 발견되지 않으면 문자열은 그대로 유지됩니다( with 의 경우 *). 따라서 해당 줄에 있는지 확인하면 됩니다.

set -- {city,town}-*.swf 
[[ ! "$*" =~ \* ]] && mkdir town

또는 case(위의 설명에 제공된 대로)

case $(ls) in
  *city-*.swf*town-*.swf*) mkdir town ;;
esac

답변4

ls이는 외부 명령을 실행하는 것보다 영향력이 덜 하고 statOS 기반 솔루션보다 이식성이 뛰어난 솔루션입니다 .

#!/bin/bash

found=false
for _ in town-*.swf, city-*.swf do
  found=true; break
done

if $found; then
  echo "Yup!"
fi

밑줄은 일회성 변수입니다. 루프는 for파일 목록을 확장하고 break긴 파일 목록을 반복하는 주기를 낭비하지 않도록 하는 쉬운 방법입니다. 실행 파일 이며 또는에서 찾을 true수 있으며 다음으로 대체할 수 있습니다.false/bin//usr/bin/bash 내장 함수 또는 함수이 최적화를 선호하는 경우.

이는 .NET에서도 작동합니다 /bin/sh. (적어도 다른 운영 체제에서는 작동합니다.)

관련 정보