我有以下脚本:
#!/usr/bin/env bash
set -eux
# Go Home.
cd /vagrant/Freya/
CLEANED_ASSETS=false
## Clean up time!
## Remove all vendor and composer.lock folders - just because.
for f in *; do
if [[ -d $f ]]; then
if [[ $f != ".git" ]] && [[ $f != "bin" ]] && [[ $f != "docs" ]]; then
if [[ $f == "Loader"]] && CLEANED_ASSETS == false; then
if [[ -d "Assets"]]; then
cd Assets/
rm -rf vendor composer.lock
CLEANED_ASSETS = true
cd ../../
fi
fi
cd "$f/"
rm -rf vendor composer.lock
cd ../
fi
fi
done
通过抛出以下错误,基本上未通过第16行检查:if [[ $f == "Loader"]] && CLEANED_ASSETS == false; then
:
$ bin/clean-directories
+ cd /vagrant/Freya/
+ CLEANED_ASSETS=false
bin/clean-directories: line 16: syntax error in conditional expression: unexpected token `;'
我不确定为什么。 有什么想法吗?
答案 0 :(得分:0)
这里有几个问题,主要是涉及不正确的间距。首先,在条件表达式(即[[ ... ]]
)中,所有元素之间的空间是必需的 - 在[[
之后,操作数和运算符之间,以及{{1 }}。因此]]
需要由[[ $f == "Loader"]]
替换,[[ $f == "Loader" ]]
需要[[ -d "Assets"]]
。其次,不能在作业中的[[ -d "Assets" ]]
周围使用,因此=
必须替换为CLEANED_ASSETS = true
。第三,CLEANED_ASSETS=true
不是比较;你需要把它写成CLEANED_ASSETS == false
。
(顺便说一下,您可以使用shellcheck.net来检查这些语法错误。)
最后,我认为最内层[[ $CLEANED_ASSETS == false ]]
中的cd
序列存在问题 - 您执行if
,然后是cd Assets/
,这会留下一个目录从你开始的地方升级。我通常建议在脚本中避免使用cd ../../
,除非它确实是必要的,因为创建这样的bug很容易。在这种情况下,我只会跳过除cd
之外的所有内容,然后使用cd
,然后再使用rm -rf Assets/vendor Assets/composer.lock
。