2017-02-20 5 views
0

У меня есть сценарий bash, где я хочу записать в файл, если одна из команд внутри оператора IF заканчивается ненулевым (поэтому, когда он выходит с ошибкой). Однако со следующим я получаю синтаксическую ошибку с неожиданным «else» в конце. Я правильно использую эту ошибку?Bash script IF и || создает ошибку синтаксиса

if [[ $f != */.* ]]; then 
     echo "$f" 
     command-one || { echo 'Something went wrong with Command-one at file ' $f ' !' >> ../corrupted.txt } || error=1 
     command-two || { echo 'Something went wrong with Command-two at file ' $f ' !' >> ../corrupted.txt } || error=1 
     command-three || { echo 'Something went wrong with Command-three at file ' $f ' !' >> ../corrupted.txt } || error=1 
     if [ error == 0 ] 
     then 
      echo "====================================================" >> ../ok.txt 
      echo "All went well with: " $f >> ../ok.txt 
     fi 
     error=0 
    else 
     echo "This file is corrupted: " $f >> ../corrupted.txt 
    fi 

ответ

2

проблемы, которую вы имеете дело с здесь является классическим примером SC1083 - This {/} is literal. Check expression (missing ;/\n?) or quote it.

} буквальным, потому что это не в начале выражения. Мы исправим его, добавив перед ним ;.

так добавить ; непосредственно перед } указать в командной терминации и двойные кавычки все ваши переменные, как,

command-one || { echo "Something went wrong with Command-one at file ${f} !" >> ../corrupted.txt; } || error=1 
command-two || { echo "Something went wrong with Command-two at file ${f} !" >> ../corrupted.txt; } || error=1 
command-three || { echo "Something went wrong with Command-three at file ${f} !" >> ../corrupted.txt; } || error=1 

Еще бы зафиксировать оператор сравнения

if [ $error -eq 0 ]; 
+0

Иисус, я бы никогда не подумал об этом. Большое вам спасибо, сейчас это работает как шарм. Пожалуйста, ребята выложите этот ответ, потому что это очень необычная вещь, которую я предполагаю. – Bert

+1

@Bert: Использовать http://www.shellcheck.net/ в будущем для исправления тривиальных ошибок синтаксиса, поймал вас таким образом. Кроме того, никто не идеален. Счастлив, ты нашел его полезным. – Inian

0

Вы пропустили ; в конце if [ error == 0 ]

+0

Включенные как ' ; 'и' -eq', но все же такая же ошибка возникает – Bert

0

== операторы и != являются для сравнения строк только

От

if [ error == 0 ] 

Для

if [ $error -eq 0 ] 

Для сравнения целых чисел необходимо использовать эти операторы (от человека) Страницы:

INTEGER1 -eq INTEGER2 
      INTEGER1 is equal to INTEGER2 

    INTEGER1 -ge INTEGER2 
      INTEGER1 is greater than or equal to INTEGER2 

    INTEGER1 -gt INTEGER2 
      INTEGER1 is greater than INTEGER2 

    INTEGER1 -le INTEGER2 
      INTEGER1 is less than or equal to INTEGER2 

    INTEGER1 -lt INTEGER2 
      INTEGER1 is less than INTEGER2 

    INTEGER1 -ne INTEGER2 
      INTEGER1 is not equal to INTEGER2 

и

command-one || { echo 'Something went wrong with Command-one at file ' $f ' !' >> ../corrupted.txt && error=1; } 
command-two || { echo 'Something went wrong with Command-two at file ' $f ' !' >> ../corrupted.txt && error=1; } 
command-three || { echo 'Something went wrong with Command-three at file ' $f ' !' >> ../corrupted.txt && error=1; } 

Пояснения

command-one || { echo 'Something went wrong with Command-one at file '$f ' !' >> ../corrupted.txt && error=1; } 

Если command-one возвращает код выхода, кроме 0, то, дополните текст упоминается в echo в файл ../corrupted.txt и установить переменную error на 1