일치하는 항목이 없으면 Bash 확장은 비어 있습니다.

일치하는 항목이 없으면 Bash 확장은 비어 있습니다.

다음과 같은 코드를 실행하면:

./script *.txt

*.txt.txt확장자를 가진 모든 파일로 확장됩니다 . 그러나 해당 파일이 없으면 스크립트는 *.txt문자열로 호출됩니다. 해당 파일이 없을 때 ""로 강제 확장할 수 있는 방법이 있는지 궁금합니다. 따라서 해당 파일이 없으면 매개변수 없이 스크립트가 호출된다는 의미입니다.

어떤 아이디어가 있나요?

답변1

이를 수행하는 방법에는 편리하고 실행 가능한 방법에 따라 여러 가지가 있습니다.

  • 스크립트를 변경할 수 없지만 인수를 정상적으로 가져오지 않는 것을 처리하는 경우 nullglob다음 명령을 사용하여 shopt -s nullglob파일 이름 글로빙을 수행하고 스크립트를 호출하는 셸에서 셸 옵션을 설정합니다. 일치하는 항목이 없으면 패턴이 완전히 제거됩니다. (이 모드는아니요빈 문자열은 여전히 ​​인수로 간주되므로 빈 문자열로 대체됩니다. )

  • 스크립트를 변경할 수 없고 인수를 가져오지 못하는 것을 정상적으로 처리할 수 없는 경우 failglob파일 이름 글로빙을 수행하고 스크립트를 호출하는 셸에서 set 셸 옵션을 사용하세요. shopt -s failglob패턴이 일치하지 않으면 쉘에서 오류가 발생하고 스크립트는아니요전혀 호출되지 않습니다.

  • 만약 너라면할 수 있는스크립트를 변경하고 첫 번째 인수를 테스트하여 [ -e "$1" ]파일 시스템에 존재하는지 확인하십시오. 존재하는 경우 파일 이름 와일드카드 패턴이 무엇인가와 일치한다는 것을 알 수 있습니다. 그런 다음 평소대로 처리를 계속할 수 있습니다. 그렇지 않으면 패턴이 어떤 것과도 일치하지 않는다고 가정하고(인수 없이 스크립트가 호출되거나 패턴이 깨진 심볼릭 링크(및 기타 다른 것)와 일치함) 필요한 경우 필요한 조치를 취하는 대상이 될 수 있습니다.

    #!/bin/bash
    
    if ! [ -e "$1" ]; then
        # no files given
        exit 1
    fi
    
    # continue processing names from "$@"...
    
  • 이전 요점과 유사하지만 스크립트를 호출하기 전에 테스트하십시오.

    set -- *.txt
    [ -e "$1" ] && ./script "$@"
    

관련 정보