[
не "специальное предложение, встроенное", и согласно POSIX a Utility syntax error (option or operand error)
из встроенного неспециального предложения Shall not exit
неинтерактивная оболочка ("сценарий").
Так что касается того, почему оболочка не выходит. Сценарий функционирует отлично потому что ECHO_ESC
установлен на что-то нормальное, неважно, как if
ответвления.
В отличие от сообщения об ошибке предлагает, ошибка не прибывает из \c
но ==
который недопустим для использования с [
(строковое равенство тестируется с синглом =
), но оболочки та поддержка [[
(который поддерживает ==
) кажется, позволяю ==
даже для нотации одиночной скобки (например. bash
, ksh
). Обратите внимание, что вышеупомянутый код не делает ошибки под ударом, таким образом, Вы могли бы хотеть рассмотреть переметки Вашего вопроса.
busybox
cut[114617] или [114618]cut[114619], встроенный в [114620]ksh93[114621] также не жалуются. GNU [114622]cut[114623] просто пытается помочь вам сказать, что вы, вероятно, не имеете правильного представления о том, что такое первый индекс.
Реальная разница, однако, в том, что GNU и busybox [114624] cut[114625] (по крайней мере, начиная с 2014-03-27 годов) считаются в байтах для [114626]-c[114627], в то время как Solaris или ksh [114628]cut[114629] считаются в символах (как того требует POSIX).
(в локали UTF-8, é (U+00E9) занимает 2 байта)[114255].
Если вы посмотрите на [114572]man cut[114573], вы увидите, что [114574]cut[114575] из GNU's [114576]coreutils[114577] насчитывает байты, символы и поля из 1:
Use one, and only one of -b, -c or -f. [...] Каждый диапазон - один из:[114788]. [114789]N[114790] [114791]N[114792] байт, символ или поле, отсчитываемое от 1
c---rw---- 1 root lp 6, 0 2011-06-26 22:47 /dev/lp0
Опять же, это может отличаться в другой системе, если ее сопровождающие решили использовать реализацию [114580]cut[114581], отличную от GNU, так что лучше быть осторожными и взглянуть на страницу управления, чтобы быть уверенным.[114241]
Это даже работало раньше на Linux. Я просто укусил его (на Debian после обновления пакета COREUTILS, который содержит команду CUT) и нашел эту ошибку.
Это ошибка в Coreutils:
https://bugs.launchpad.net/ubuntu/+source/coreutils/+bug/211262
Кто-то сломал обратную совместимость, и никто не исправил. Раньше было такое 0 было хорошо, тоже и рассматривается как 1. Теперь 0 выпускает ошибку. Таким образом, все сценарии, которые зависят от этого поведения, сломаны и должны быть изменены.