Bash 조건문 시퀀스 단순화

Bash 조건문 시퀀스 단순화

나는 이러한 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 모드를 사용한다는 것은 마지막 점을 포함하여 값의 모든 것을 제거하는 것을 의미합니다.$variablepattern*.

이 답변에서 수행된 모든 패턴 일치는 정규식이 아닌 쉘 패턴을 통해 수행됩니다.

관련 정보