내 디렉토리 구조는 아래와 같습니다.
.
|- test-master-65875866-backup
|- test-master-86565875
다음 코드를 시도했습니다 (이중 괄호도 사용)
if [ -d ${TRAVIS_REPO_SLUG#*/}-${TRAVIS_BRANCH}-*-backup ];
then
echo "Removing previous backup"
docker rm -f -v \$(docker ps -a -q --filter name=backup)
sudo rm -rf ${TRAVIS_REPO_SLUG#*/}-${TRAVIS_BRANCH}-*-backup
fi
하지만 여전히 오류가 발생합니다.
[: binary operator expected
이 오류는 travis에만 나타나고 로컬에는 나타나지 않는다는 것을 알고 싶습니다.
노트: ${TRAVIS_REPO_SLUG#*/}
여기에 포함 되어 test
있습니다 .${TRAVIS_BRANCH}
master
다음 순열을 모두 시도했지만 오류가 사라지지 않습니다.
if [ -d "$TRAVIS_REPO_SLUG#*/"-"$TRAVIS_BRANCH"-*-backup ]; then
if [ -d "${TRAVIS_REPO_SLUG#*/}"-"${TRAVIS_BRANCH}"-*-backup ]; then
if [ -d "${TRAVIS_REPO_SLUG#*/}-${TRAVIS_BRANCH}-*-backup" ]; then
그러나 아래 코드(! 포함)에서는 오류가 발생하지 않습니다.
if [ ! -d ${TRAVIS_REPO_SLUG#*/}-${TRAVIS_BRANCH}-*-backup ]
답변1
[ -d ${TRAVIS_REPO_SLUG#*/}-${TRAVIS_BRANCH}-*-backup ];
여기에 인용되지 않은 내용은 *
일치하는 파일 이름으로 확장됩니다.
$ mkdir test-master-123-backup test-master-456-backup
$ a=test b=master
$ echo $a-$b-*-backup
test-master-123-backup test-master-456-backup
따라서 [
예상보다 더 많은 매개변수를 얻게 됩니다 -d
. -d
오류 메시지에서 알 수 있듯이 중간이 이진 연산자일 것으로 예상하기 때문에 파일 이름과 함께 총 3개를 얻을 수 있습니다 .
참조된 버전에서는 동일한 오류가 발생하지 않아야 하지만 대신 이름에 텍스트가 있는 파일을 찾게 되는데 *
이는 아마도 원하는 것이 아닐 수 있습니다.*
패턴과 일치하는 디렉터리가 있는지 확인하려면 다음을 수행할 수 있습니다.
any=0
# set IFS to empty if you expect to have directories with whitespace in names
# IFS=''
for f in $a-$b-*-backup; do
if [ -d "$f" ]; then
any=1
fi
done
if [ "$any" = 1 ]; then
echo "some directories matching $a-$b-*-backup were found"
fi
또는 Bash의 더 간단한 방법입니다. 후행 슬래시는 glob이 디렉터리에만 일치하도록 하거나 nullglob
아무것도 일치하지 않는 경우 glob을 빈 목록으로 만듭니다.
IFS=''
shopt -s nullglob
set -- $a-$b-*-backup/
if [ "$#" != 0 ]; then
echo "$# directories matching $a-$b-*-backup were found"
fi