[: operador binário esperado

0

Minha estrutura de diretórios é algo como abaixo.

.
|- test-master-65875866-backup        
|- test-master-86565875

Eu tentei o seguinte código (também com colchetes duplos)

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

mas ainda estou recebendo o erro:

[: binary operator expected

Eu estou querendo saber este erro ficando apenas no travis mas não no local.

Observação: ${TRAVIS_REPO_SLUG#*/} contém test e ${TRAVIS_BRANCH} contém master aqui.

Eu tentei todas as permutações a seguir, mas o erro não desaparece.

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

No entanto, o código abaixo (com!) não fornece nenhum erro.

if [ ! -d ${TRAVIS_REPO_SLUG#*/}-${TRAVIS_BRANCH}-*-backup ]

Aqui está o meu código completo

    
por SkyRar 09.10.2018 / 12:43

1 resposta

0

[ -d ${TRAVIS_REPO_SLUG#*/}-${TRAVIS_BRANCH}-*-backup ];

O * sem aspas aqui será expandido para qualquer nome de arquivo correspondente

$ 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

Portanto, [ obtém mais argumentos do que o esperado para -d . Ele provavelmente recebe três no total ( -d e nomes de arquivos), pois esse é o caso em que ele espera que o intermediário seja um operador binário, como sugere a mensagem de erro.

A versão em que o * é citado não deve dar o mesmo erro, em vez disso, ele procurará um arquivo com um literal * no nome, o que provavelmente não é o que você deseja.

Se você quiser ver se há diretórios correspondentes a esse padrão, você pode fazer algo assim:

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

Ou, de uma maneira um pouco mais simples no Bash. A barra à direita faz com que os glob correspondam apenas aos diretórios, e nullglob faz com que o glob se transforme em uma lista vazia se não corresponder a nada:

IFS=''
shopt -s nullglob
set -- $a-$b-*-backup/
if [ "$#" != 0 ]; then
    echo "$# directories matching $a-$b-*-backup were found"
fi
    
por 09.10.2018 / 18:27