我的目录结构如下所示。
.
|- 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
以及文件名),因为在这种情况下,它期望中间的一个是二元运算符,正如错误消息提示的那样。
引用的版本不应给出相同的错误,而是会查找名称中*
带有文字的文件,这可能不是您想要的。*
如果您想查看是否有任何目录与该模式匹配,您可以执行以下操作:
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