[:需要二元运算符

[:需要二元运算符

我的目录结构如下所示。

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

相关内容