다음과 같은 패턴과 일치하는 모든 파일을 압축하기 위해 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
이 문제는 두 가지 방법으로 해결할 수 있습니다.
인수 목록에서 아카이브 이름을 선택한 다음 목록을 이동하여 위치 인수 목록에서 아카이브 이름을 제거하고 마지막으로
"$@"
호출에서 (나머지 인수)를 사용합니다zip
.#!/bin/sh archive=$1 shift zip "$archive" "$@"
모든 변수가 인용되어 있으므로 공백 등이 포함된 파일 이름을 사용할 수도 있습니다.
의 경우
bash
다음과 같이 읽기가 더 어려울 수 있습니다.#!/bin/bash zip "$1" "${@:2}"
유틸리티
zip
는 쉘 글로빙 패턴 자체를 확장하는 방법을 알고 있습니다. 이 사실을 사용하여 스크립트에무늬파일 이름 목록 대신:#!/bin/sh zip "$1" "$2"
이 스크립트를 호출해야 합니다.
./myScript.sh myzip 'test*'
인용하면
test*
쉘 확장 모드(우리가 원하는 것)가 방지됩니다.의지하다첫 번째 옵션에서).