zip 명령을 사용하는 스크립트는 와일드카드를 사용할 수 없습니다.

zip 명령을 사용하는 스크립트는 와일드카드를 사용할 수 없습니다.

다음과 같은 패턴과 일치하는 모든 파일을 압축하기 위해 bash 쉘 스크립트를 만들었습니다.

#!/bin/bash
zip $1 $2

./myScript.sh myzip test*위의 스크립트를 사용하여 실행할 때시험내 디렉터리에 이 패턴과 일치하는 파일이 2개(test1 및 test2) 있더라도 zip에 추가됩니다.

zip쉘에서 직접 명령을 실행 하면 예상대로 작동하고 둘 다 추가됩니다.테스트 1그리고테스트 2myzip에. 하지만 이 작업을 수행하기 위해 스크립트를 사용하면 파일이 1개만 추가됩니다.

내가 무엇을 놓치고 있나요?

답변1

이렇게 스크립트를 호출하면

./myScript.sh myzip test*

매개변수 및 를 사용하여 스크립트를 제공합니다 myzip. 쉘은 test1실제로 스크립트를 호출하기 전에 test2패턴의 마지막 두 매개변수를 확장합니다 . 에서는 사용할 수 있지만 스크립트에서는 사용되지 않습니다.test*test2$3$3

이 문제는 두 가지 방법으로 해결할 수 있습니다.

  1. 인수 목록에서 아카이브 이름을 선택한 다음 목록을 이동하여 위치 인수 목록에서 아카이브 이름을 제거하고 마지막으로 "$@"호출에서 (나머지 인수)를 사용합니다 zip.

    #!/bin/sh
    
    archive=$1
    shift
    
    zip "$archive" "$@"
    

    모든 변수가 인용되어 있으므로 공백 등이 포함된 파일 이름을 사용할 수도 있습니다.

    의 경우 bash다음과 같이 읽기가 더 어려울 수 있습니다.

    #!/bin/bash
    
    zip "$1" "${@:2}"
    
  2. 유틸리티 zip는 쉘 글로빙 패턴 자체를 확장하는 방법을 알고 있습니다. 이 사실을 사용하여 스크립트에무늬파일 이름 목록 대신:

    #!/bin/sh
    
    zip "$1" "$2"
    

    이 스크립트를 호출해야 합니다.

    ./myScript.sh myzip 'test*'
    

    인용하면 test*쉘 확장 모드(우리가 원하는 것)가 방지됩니다.의지하다첫 번째 옵션에서).

관련 정보