сценарий оболочки с интересной ошибкой

необходимо попробовать sed вместо этого

sed 's/\.//g'

2
26.10.2015, 22:57
2 ответа

В bash нет ошибки: код работает так, как должен работать.

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

Обратите внимание, что ниже приведен просто один оператор echo с многострочной строкой для вывода:

        /bin/echo "HERE IS MISTAKE WITHOUT QUOTE IN THE END
        exit
fi

/bin/echo " BLACK HOLE "
/bin/echo " CODE WILL NEVER PROCEED "

if [ 0 -eq 1 ]; then
        /bin/echo "SECOND MISTAKE

Чтобы пояснить, давайте заменим эту длинную строку на "многострочная строка опущена". Тогда код будет выглядеть просто:

/bin/echo "Silent Err 'unexpected EOF while looking for matching' Example:"

if [ 0 -eq 1 ]; then
        /bin/echo "multiline string omitted"
        exit
fi
/bin/echo "normal code... will work";
/bin/echo "Good and silent exit without any notice about BLACK HOLE code..."
/bin/echo "exit."

Приведенный выше код является правильно работающим.

4
27.01.2020, 21:56

Я не уверен, что означает "основа этого поведения", но как я это интерпретирую:

На самом деле (кажущаяся) несопоставленная строка без кавычек "ЗДЕСЬ ОШИБКА БЕЗ КАВЫЧЕК В КОНЦЕ просто начинает цитируемый строковый литерал. Этот строковый литерал проходит мимо первого fi и охватывает все до символа двойной кавычки, с которого начинается "ВТОРАЯ ОШИБКА".

Итак, bash может разобрать весь этот беспорядок, хотя и неправильно с человеческой точки зрения. Оказывается, поскольку 1 не равна 0, весь блок кода, от /bin/echo "HERE IS MISTAKE до fi, следующего за "SECOND MISTAKE, не выполняется. Таким образом, (кажущаяся) строка SECOND MISTAKE анализируется правильно, как возможная команда, но bash никогда не пытается ее выполнить, поэтому мы не видим ошибки SECOND: command not found или какой-либо другой.

Подведем итог: пропущенные кавычки в двух строках приводят к тому, что bash разбирает код как "истинный" пункт единственного if-then-fi, но условие ложно, поэтому bash никогда не пытается выполнить то, что человеческий глаз видит как плохую команду, и не выдает соответствующей синтаксической ошибки.

1
27.01.2020, 21:56

Теги

Похожие вопросы