Я запутался, используя операторы Or & And

Нельзя использовать одинарные кавычки в строке с одинарными кавычками.

Вместо этого используйте двойные кавычки вокруг выражения sed:

sed -i "s/ENCRYPTION='Y'/ENCRYPTION='N'/g"

Я сомневаюсь, что это волшебным образом расшифрует ваши данные, но по крайней мере строки в файле будут заменены так, как вы, вероятно, и предполагали.


Ваша исходная команда пыталась заменить ENCRYPTION=YнаENCRYPTION=N(обратите внимание на отсутствующие одинарные кавычки ). Это связано с тем, что начальная одинарная кавычка в 'Y'заканчивает строку s/ENCRYPTION=. Затем вы объединяете Yбез кавычек с этим, за которым следует строка /ENCRYPTION=в одинарных кавычках, за которой следует Nбез кавычек и строка /gв одинарных кавычках.

0
28.08.2021, 06:21
2 ответа

У меня есть краткое объяснение &&и ||в этом ответе :https://unix.stackexchange.com/a/31881/4506m, но вот более подробное объяснение ваших конкретных примеров.

Во-первых, важно знать, что команды unix либо завершаются успешно , либо завершаются неудачно , независимо от того, какой результат они могут выдать или не выдать. Точнее, команда завершается успешно, если ее статус выхода равен нулю, и терпит неудачу, если она имеет статус выхода, отличный от -нулевой, но мышление с точки зрения статусов выхода сбивает с толку.

Учитывая это, вы могли бы подумать о

  • cmd1 && cmd2 &&... && cmdNкак оценивание команд слева направо до тех пор, пока одна из них не даст сбой, и
  • cmd1 || cmd2 ||... && cmdNкак оценивание команд слева направо до тех пор, пока одна из них не будет успешной.

Итак, начнем с вашего первого примера

echo 1 && false && echo 2 || echo 3

Это становится немного более запутанным из-за объединения операций &&и ||без круглых скобок, что делает предполагаемую группировку неясной. Оказывается, &&и ||имеют одинаковый приоритет и группу слева, но подобные смешанные последовательности часто сбивают с толку. Точное значение этого выражения

( ( ( echo 1 && false ) && echo 2 ) || echo 3 )

Хорошо, что здесь происходит?

  • Оболочка начинает вычислять (... || echo 3 ), но для этого она должна сначала обработать левую команду.

  • Оболочка начинает вычислять (... && echo 2 ), но для этого она должна сначала обработать левую команду.

  • Оболочка начинает вычислять ( echo 1 && false ), но для этого она должна сначала обработать левую команду.

  • Оболочка оценивает echo 1, что всегда будет успешным, т. е. выход с нулевым кодом состояния. Тот факт, что echo 1тоже что-то печатает, не имеет отношения к оператору &&, но объясняет первую строку вашего вывода, 1\n.

  • Левый операнд первого ( echo 1 && false )удалось,поэтому оболочка продолжает вычислять правильный операнд, false. Это команда, которая всегда терпит неудачу, и поэтому выражение &&в целом терпит неудачу.

  • Левый операнд (... && echo 2 )уже дал сбой, поэтому оболочка не выполняет echo 2, и само это выражение завершается ошибкой.

  • Сбой левого операнда (... || echo 3 ), поэтому оболочка выполняет echo 3. Эта команда выводит вторую строку вывода, но, что более важно для оператора ||, echoвсегда выполняется успешно, поэтому вся последовательность операторов &&и ||выполняется успешно.

  • Если после выполнения команды вы набрали echo $?, вы увидите нулевое значение, указывающее на то, что предыдущая команда выполнена успешно.

Второй пример можно оценить с помощью того же процесса, описанного выше, но давайте рассмотрим его подробно.

echo 2 || echo 3

Это намного проще, чем ваш первый пример. Оболочка проходит следующие этапы.

  • Оболочка начинает вычислять echo 2 || echo 3, но для этого она должна сначала оценить левую часть.

  • Оболочка оценивает echo 2. Это напечатает вашу одну выходную строку и преуспеет.

  • Оболочка продолжает вычисление echo 2 || echo 3, за исключением того, что теперь, поскольку левая рука выполнена успешно, правила ||гласят, что правая часть вообще не оценивается (, и, следовательно, вы не получаете еще одну строку вывода ). Поскольку левая часть выполнена успешно, все выражение ||выполнено успешно.

Это довольно подробно, но я надеюсь, что это поможет.

1
30.08.2021, 08:49

Оболочка выполняет команды в строгом порядке слева направо (для списков ИЛИ и И ).

В этой команде:

echo 1 && false && echo 2 || echo 3

Первая команда — echo 1. Он выполняется, и статус выхода становится 0(, даже если он уже был 0 в начале ), поскольку статус выхода эха всегда 0.

Когда первый &&найден, статус выхода равен 0 (сверху ), что означает, что выполнение было успешным, тогда &&принимается и выполняется следующая команда.

При выполнении falseстатус выхода становится 1 (сбой ).

При обнаружении следующего &&текущий статус выхода равен 1, &&отклоняется, а следующая команда(echo 2)не выполняется.

Но в строке еще больше кода, поэтому оболочка переходит к следующему элементу, ||. Будучи текущим статусом выхода 1в этот момент, ||принимается и выполняется следующая команда (echo 3).

Команду echo 2 || echo 3очень легко проанализировать. Первая команда выполняется (всегда ), чтобы получить код выхода. Этот код выхода — 0, следующий ||отклоняется, а echo 3не выполняется. Больше нечего обрабатывать, конец строки.

1
30.08.2021, 08:31

Теги

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