2012-04-05 2 views
1

나는 bash 스크립트의 초보자이며 다음과 같은 문제가있다. find 나 grep과 선택적 매개 변수로 특정 문자열을 포함하는 파일을 검색 할 수있는 검색 스크립트를 만들고자하고있다. 하나의 마지막 문제, 모든 경우에 조건과 일치하지 않는 * 문자가 붙어 있습니다.bash에서 * = '*'를 만드는 방법은?

내 스크립트에 3 개 개의 매개 변수가 있습니다 : (필수)

  • file_name_pattern (선택 사항)
  • 경로 (선택 사항)

    • string_to_search는

    예 :

    ./search_text.sh 'string_to_search' 'file_name_pattern' /path 
    

    내가 가고 싶다. t 다음

    • file_name_pattern이 (따옴표와 함께 또는없이) 지정 또는이다 *되지 않은 경우 => 그렙
    • file_name_pattern보다 다른 것 인 경우 * 또는 '*'=> 찾을 + grep을

    #!/bin/bash 
    
    # ------------------------------------ 
    # Set default values for optional parameters (tests) 
    
    if [ ! -z $2 ] 
    then 
        FILE_TYPE=$2 
        echo 'FILE_TYPE : var 2' 
    else 
        FILE_TYPE="*" 
        echo 'FILE_TYPE : *' 
    fi 
    
    if [ ! -z $3 ] 
    then 
        LOCATION=$3 
        echo 'LOCATION : var 3' 
    else 
        LOCATION=. 
        echo 'LOCATION : .' 
    fi 
    
    # ------------------------------------ 
    # Do search/show conditions 
    
    if [ "$FILE_TYPE" == \* ]; 
        then 
        #grep -rn -C 0 --color=always "$1" $LOCATION | less -R; 
        echo ' => GREP'; 
        else 
        #find $LOCATION -iname $FILE_TYPE | sort | xargs grep "$1" --color=always -n 2>/dev/null | less -R; 
        echo '=> FIND'; 
    fi 
    

    그냥 테스트 끝에 2 개 에코을 표시하려면이 코드를 실행 :

    여기 내 코드입니다.

    지금 내 문제 : 나는 다음과 같은 조건을 쓸 수있는 방법 즉

    ./search_text.sh 'string_to_search' '*.php' /path => works (FIND) 
    ./search_text.sh 'string_to_search' '*' /path  => works (GREP) 
    ./search_text.sh 'string_to_search' '*'   => works (GREP) 
    ./search_text.sh 'string_to_search' *    => ERROR => goes to FIND INSTEAD OF GREP :-(
    ./search_text.sh 'string_to_search'    => works (GREP) 
    

    : 통과 할 때

    if [ "$FILE_TYPE" == \* ]; 
    

    그래서 *는 '*'와 동일하게 고려되어야한다 명령 줄에서 매개 변수로 이러한 값을?

    스크립트에서 따옴표없이 *를 전달할 때 \ * 조건을 이스케이프 처리해도 일치하지 않습니다. 즉

    , 내가 할 싶은 * * = '*'그래서, 다른 명령과 같은 일반 와일드 카드로 어떤 도움

    많은 감사를 고려해야합니다!

  • +0

    덕분에 Attila와 Sorpigal ;-) 음, * char를 이스케이프 처리하고 문자열로 취급하는 간단한 방법이 있다고 생각했지만 따옴표로 사용합니다. 도움을 다시 주셔서 감사합니다. – user1186503

    답변

    3

    당신은

    을 사용하여 모든 글로브 확장을 비활성화 할 수 있습니다, 또는 백 슬래시 ('\')와 함께 탈출 - 당신이 그랬던 것처럼 - 그것을 방지하기 위해 내가 알고있는 유일한 방법은 apostophes에 ( ')를 둘러싸이다
    set -o noglob 
    

    는 이후 * 특별한되지 않습니다 :

    $ ls * 
    ls: *: No such file or directory 
    

    그러나, 스크립트를 호출하기 전에이 작업을 수행하는 사용자를 강제 할 수있는 방법이 없습니다. 스크립트가 아닌 사용자의 쉘이 globbing을 제어하기 때문에 당신은 의존하지 않습니다.

    귀하의 유일한 옵션은 그게 어쨌든 무엇 때문에

    ./search_text.sh 'string_to_search' * 
    

    정확히

    같은
    ./search_text.sh 'string_to_search' file1 file2 
    

    을 치료하는 것입니다.

    즉, 후행 디렉토리가 지정되어 있지 않고 $1이 아닌 경우 *grep 사례를 사용하십시오.

    4

    *을 bash에 쓰면 현재 디렉토리에서 파일 일치로 해석됩니다. 따라서 여러분의 스크립트는 실제로 ./search_text.sh 'string_to_search' a.txt b.txt으로 호출됩니다 (현재의 dirtectory에는 'a.txt'와 'b.txt'라는 두 개의 파일 만 있다고 가정). 'a.txt'는 '*'가 아니기 때문에, find 코드가 실행됩니다.

    관련 문제