2015-01-19 7 views
2

파일 유형에 따라 다운로드 디렉토리의 파일을 구성하는 스크립트가 있습니다.파이프 기호를 사용하여 여러 인수를 bash 스크립트의 case 문에 전달하는 방법

function moveto { 
    for filename in * 
    do 
    case "${filename##*.}" in 
     $1) echo "!";; # echo statement for debugging 
    esac 
    done 
} 

내 다운로드 디렉토리에는 .png 파일이 있습니다.
moveto "png"으로 전화하면 느낌표가 나타납니다.
moveto "png|jpg"으로 전화 할 때 느낌표는이 표시되지 않습니다.
변수를 사용하지 않고 단순히 case 문에 png|jpg을 입력하면 느낌표가 나타납니다.

나는 몇 가지 방법 이상으로 변화를 시도했다. 작은 따옴표, 큰 따옴표, 따옴표, 별명 등을 사용하면 아무 것도 작동하지 않습니다. 누군가가 도울 수 있다면 좋을 것입니다.

답변

5

| case 문에있는 문은 case 문 구문의 일부이므로 소스 코드의 일부 여야합니다. 패턴 목록을 종료 (동일은 의 사실이다)가)

당신은 확장 globs의 ( shopt -s extglob)를 가능하게하고 하나를 사용하여 원하는 효과를 얻을 수 있습니다

:.

moveto "@(png|jpg)" 

확장 글로브 패턴은 bash manual에 설명되어 있습니다. 그들은 *, +, 중 하나의 문자로 구성됩니다., @ 또는 ! 다음에 괄호로 묶은 패턴 목록을 |. 초기 문자 의미는 대부분 잘 알고 :

moveto() { 
    local pattern="@($(tr ' ' '|'<<<"$*"))" 
    local filename 
    for filename in *; do 
    case "${filename##*.}" in 
     $pattern) echo "!";; # echo statement for debugging 
    esac 
    done 
} 

moveto png jpg 
: 당신이 공상 얻고 싶었다 경우

* zero or more repetitions of any of the patterns 
+ one or more repetitions of any of the patterns 
? nothing or exactly one of the patterns 
@ exactly one of the patterns 
! does not match any of the patterns 

, 당신은 패턴 자신을 조립 수