2014-03-07 3 views
-1

에이 질문에 제안 : Test whether a glob has any matches in bash테스트 - 나는 대답을 시도하고 변수

if test -n "$(find . -maxdepth 1 -name 'glob*' -print -quit)" 
then 
    echo found 
else 
    echo not found 
fi 

그러나, 나는 변수 스크립트에서이 일을하고있다.

not found 

그러나 이것이 인용 문제가

find . -maxdepth 1 -name "*12*.idx" -print -quit 

나에게 그 결과

./notes_archive_2012.idx 

을 제공하는 명령 자신을 실행 : 스크립트를 실행

#!/bin/sh 
directory=~/nd 
glob="*12*.idx" 
cd $directory 
if test -n "$(find . -maxdepth 1 -name \"$glob\" -print -quit)" 
then 
    echo found 
else 
    echo not found 
fi 

나를 준다?

답변

1

예, 이는 인용의 문제입니다. 인용 부호는 $(...) 안에 이스케이프해서는 안됩니다. 고려 : -name에 위의 양식에

test -n "$(find . -maxdepth 1 -name \"$glob\" -print -quit)" # Wrong 

, 인수를 find가 시작을보고 리터럴 따옴표로 끝나는 것이다. 파일 이름 자체가 큰 따옴표로 시작되고 끝나면 파일 이름 만 일치시킵니다.

test -n "$(find . -maxdepth 1 -name "$glob" -print -quit)" # Right 

man bash에서 :

다음

당신이 원하는 것을

$ (명령) 양식을 사용하여, 괄호 사이의 모든 문자가 명령까지 만들; 아무도 특별하게 대우받지 않는다.

즉, $(...) 안에있는 명령에 큰 따옴표를 사용하려면 큰 따옴표 만 사용하면됩니다. $(...) 안의 명령은 명령 줄에 입력 한 것처럼 작성해야합니다.

+0

우수에 맞게 빈 얻을 수 있도록

fnmatch() { case "$2" in $1) return 0 ;; *) return 1 ;; esac ; } 

내가이 변형을 사용, 감사합니다. :) –

0

외부 명령없이이 작업을 수행 할 수 있습니다.

files=($glob) 
if [[ -f "${files[0]}" ]]; then 
    echo found 
else 
    echo not found 
fi 
0

찾기가 존재 로컬 파일에 대한 아니라 원격 파일이나 다른 시간에 파일 작동 : 또한 배열을 사용할 수 있습니다

# Use the loop as a context for expanding the glob, not actually iterating 
# over the results. 
for f in $glob; do 
    if [[ -f "$f" ]]; then 
     echo found 
    else 
     echo not found 
    fi 
    break 
done 

: 한 가지 방법은 for 루프 조금을 남용하는 것입니다 로컬에 존재하지 않습니다. 때로는 임의로 일치하는 패턴이 있는지 확인하려고합니다. 패턴은 문자열에 있습니다.

bash는 [[ "$string" == shellmatch* ]][[ "$string" =~ ^regexmatch.* ]]을 지원하지만 일치 매개 변수가 문자열 인 [[ "$string" == "$shellmatch" ]]의 형식을 지원하지 않습니다. 제대로 포맷 된 새로운 쉘 스크립트를 작성하지 않고 문자열을 처리하기 위해 bash를 속이는 방법을 찾지 못했습니다. 공백이나 대괄호가 올바르게 지원되지 않을 것입니다.

에서 Rich’s sh (POSIX shell) tricks은 대부분의 POSIX 셸에서 대소 문자를 사용하거나 영리한 인용 부호 만 사용하는 하나의 라이너입니다. bash, sh와 함께 작동하도록 테스트되었습니다.zsh에서 작동하지 않는 것으로 테스트되었습니다. 나는 모든

fnmatch() { [ -z "$1" ] && return 0; case "$2" in $1) return 0 ;; esac; return 1 ; } 

Examples:

fnmatch 'ab \?def' 'ab ?def' && echo 'matched' # \ supported 
fnmatch 'ab ?def' 'ab cdef'  && echo 'matched' # ? supported 
fnmatch 'ab [cd]def' 'ab cdef' && echo 'matched' # [] supported 
fnmatch 'ab {c,d}def' 'ab cdef' && echo 'matched' # case does not support brace expansion 
fnmatch 'ab c*' 'ab cdef'  && echo 'matched' # space supported 
fnmatch 'ab) c*' 'ab) cdef'  && echo 'matched' #) supported, does not interfere with case 
관련 문제