在 bash 中使用常量(变量)

  • 本文关键字:变量 常量 bash 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 `;'

我也不知道为什么。有什么想法吗?

尝试使用

if [[ $f == "Loader" ]] && [[ $CLEANED_ASSETS == "false" ]]; then

相反

这里有几个问题,主要涉及不正确的间距。首先,在条件表达式中(即[[ ... ]]),所有元素之间都需要空格 - 在[[之后,操作数和运算符之间,以及]]之前。因此,[[ $f == "Loader"]]需要被[[ $f == "Loader" ]]取代,[[ -d "Assets"]]需要[[ -d "Assets" ]]。其次,作业中的=不能在周围使用空格,因此必须用CLEANED_ASSETS=true替换CLEANED_ASSETS = true。第三,CLEANED_ASSETS == false不是比较;您需要将其写为[[ $CLEANED_ASSETS == false ]].

(顺便说一句,您可以使用 shellcheck.net 来检查此类语法错误。

最后,我认为最内层if中的cd序列存在问题 - 你做cd Assets/,然后是cd ../../,这将使你从你开始的地方高一个目录级别。除非确实有必要,否则我通常建议避免在脚本中cd,因为创建这样的错误真的很容易。在这种情况下,我只会跳过除第一个cd之外的所有内容并使用rm -rf Assets/vendor Assets/composer.lock,然后再使用rm -rf "$f/vendor" "$f/composer.lock"

相关内容

  • 没有找到相关文章

最新更新