[: バイナリ演算子が必要

[: バイナリ演算子が必要

私のディレクトリ構造は次のとおりです。

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

関連情報