私のディレクトリ構造は次のとおりです。
.
|- 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