当带有扩展通配选项的“cp”语句移动到“if”块时出现语法错误

当带有扩展通配选项的“cp”语句移动到“if”块时出现语法错误

在 Bash 中进行复制时遇到一些问题。这工作正常:

# Enable extended globbing and include filenames beginning with a '.'
shopt -s extglob dotglob
# Copy git repo to expected place
cp -r !($YOCTO_DIR) $POKY_DIR/$GIT_REPO_NAME/

但当我if对此发表声明时:

if [ -z "$FROM_JENKINS" ]; then
    # FROM_JENKINS is blank, this is a local build

    # Enable extended globbing and include filenames beginning with a '.'
    shopt -s extglob dotglob
    # Copy git repo to expected place
    cp -r !($YOCTO_DIR) $POKY_DIR/$GIT_REPO_NAME/
fi

我得到:

./build.sh: line 80: syntax error near unexpected token `('

80 号线是cp.如果我删除括号它会起作用:

    cp -r . $POKY_DIR/$GIT_REPO_NAME/

为什么该if语句不喜欢括号中的cp

答案1

问题在于读取和执行的顺序和“范围”。

整个if块只是一个命令。因此 shell 必须先读取该命令,然后才能执行该命令。

这意味着规则没有 shopt -s extglob dotglob(我指的是这里的行,而不是其所有内容;正如 ilkkachu 在评论中指出的那样: thedotglob与问题无关)在if块结束之前都有效,因为shopt仅在之后执行。如果没有的话,shopt -s extglob!(是非法的。

因此,您必须将 移至shopt之前if(并且可能会在else分支中将其恢复)。

相关内容