在bash中使用常量(变量)

时间:2015-05-11 00:55:54

标签: bash

我有以下脚本:

#!/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 `;'

我不确定为什么。 有什么想法吗?

1 个答案:

答案 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