2015-05-11 3 views
0

У меня есть следующий сценарий:Использование констант (переменных) в Баш

#!/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

Чтобы указать значение, содержащееся в 'CLEANED_ASSETS', вы должны префикс имени' ''. Также добавьте значение внутри двойных кавычек: '' $ CLEANED_ASSETS "==" false "' – higuaro

ответ

2

Попробуйте использовать

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

вместо

+1

Это решает одну проблему, но не другую: вам нужно пространство перед ']]', которое закрывает условное выражение. –

+0

Спасибо за совет. Я тоже исправил это. – mikyra

0

Есть несколько проблем, в основном связанные неправильный интервал. Во-первых, в условном выражении (то есть [[ ... ]]) пробелы требуется между всеми элементами - после [[ между операндами и операторами и до ]]. При этом [[ $f == "Loader"]] необходимо заменить на [[ $f == "Loader" ]] и [[ -d "Assets"]] должно быть [[ -d "Assets" ]]. Во-вторых, пробелы не могут использоваться в задаче =, поэтому CLEANED_ASSETS = true необходимо заменить на CLEANED_ASSETS=true. В-третьих, CLEANED_ASSETS == false - это не сравнение; вам нужно написать его как [[ $CLEANED_ASSETS == false ]].

(Кстати, вы можете использовать shellcheck.net, чтобы проверить на наличие ошибок синтаксиса, как эти.)

Наконец, я думаю, что есть проблема с cd последовательности в сокровенной if - вы cd Assets/, а затем cd ../../, который оставит вас на одном уровне каталогов вверх с того места, где вы начали. Обычно я рекомендую избегать cd в сценариях, если это действительно необходимо, потому что очень легко создавать такие ошибки. В этом случае я просто пропустил все, кроме первого cd, и воспользуюсь rm -rf Assets/vendor Assets/composer.lock, а затем rm -rf "$f/vendor" "$f/composer.lock".

Смежные вопросы