[: 이진 연산자 필요

[: 이진 연산자 필요

내 디렉토리 구조는 아래와 같습니다.

.
|- 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

관련 정보