어떻게 해야 하나요?
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
이는 외부 명령을 실행하는 것보다 영향력이 덜 하고 stat
OS 기반 솔루션보다 이식성이 뛰어난 솔루션입니다 .
#!/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
. (적어도 다른 운영 체제에서는 작동합니다.)