나는 이러한 bash 명령 시퀀스를 가지고 있으며 이를 단순화하고 싶습니다. 어떤 도움이라도 대단히 감사하겠습니다.
[[ "$fl" == *"img"* ]] && mv "$flimg" "$out"
[[ "$fl" == *"png"* ]] && mv "$flimg" "$out"
[[ "$fl" == *"jpg"* ]] && mv "$flimg" "$out"
[[ "$fl" == *"tif"* ]] && mv "$flimg" "$out"
답변1
bash는 모든 검사를 수행할 수 있는 확장 정규식을 지원합니다. 예를 들면 다음과 같습니다.
[[ $file =~ (img|png|jpg|tif) ]] && echo do-something
변수인지 확인문서주어진 문자열을 포함합니다(필자는=~
운영자정규식 일치의 경우).
답변2
정규 표현식의 대안으로 덜 우아한 접근 방식은 다음과 같습니다.결합된 조건문Bash에서 -를 사용하면 OR
이중 파이프( ||
)가 됩니다.
[[ "$fl" == *"img"* || "$fl" == *"png"* || "$fl" == *"jpg"* || "$fl" == *"tif"* ]] && mv "$flimg" "$out"
이중 파이프는 Bourne 또는 Korn 쉘에서도 작동합니다. 단일 중괄호( []
)를 사용하고 (Bourne에만 해당) ==
로 변경하면 됩니다.=
[ "$fl" = *"img"* || "$fl" = *"png"* || "$fl" = *"jpg"* || "$fl" = *"tif"* ] && mv "$flimg" "$out"
답변3
POSIX 표준 sh
구문( 에서도 유효함)을 사용하면 다음 명령문을 사용할 bash
수 있습니다 .case
case $fl in
*img*|*jpg*|*png*|*tif*)
mv -- "$flimg" "$out"
esac
또는 "선"으로,
case $fl in (*img*|*jpg*|*png*|*tif*) mv -- "$flimg" "$out"; esac
extglob
쉘 활성화 옵션을 사용하는 경우 shopt -s extglob
다음을 사용할 수도 있습니다.
[[ $fl == *@(img|jpg|png|tif)* ]] && mv -- "$flimg" "$out"
파일 이름의 마지막 점 뒤에 오는 파일 이름 접미사만 테스트하려는 경우 $fl
:
case ${fl##*.} in (img|jpg|png|tif) mv -- "$flimg" "$out"; esac
아니면 그 이후 shopt -s extglob
에는
[[ ${fl##*.} == @(img|jpg|png|tif) ]] && mv -- "$flimg" "$out"
표준 확장은 ${variable##pattern}
일치 항목에서 가장 긴 접두사 문자열을 제거합니다. as 모드를 사용한다는 것은 마지막 점을 포함하여 값의 모든 것을 제거하는 것을 의미합니다.$variable
pattern
*.
이 답변에서 수행된 모든 패턴 일치는 정규식이 아닌 쉘 패턴을 통해 수행됩니다.