Виконайте дві команди у випадку || або &&


11

Я читав про && та || і я хотів би виконати дві команди у помилковому випадку.

Я намагався, ;але це працює завжди . Я спробував поставити його у фігурні дужки, { command1; command2 }але це призводить до синтаксичної помилки.

Я хочу зробити щось подібне

command && echo "Ok, continuing" || echo "Check internet connection"; exit 1

який закривається лише за відсутності підключення до Інтернету.


1
Це здається простою друкарською помилкою. Ще цікавішим питанням є питання про відмінності між ()та {}.
edwinksl

Відповіді:


27

Використання parenns додає команди в підрозділ, який не завжди є тим, що ви хочете. Як варіант, використовуйте фігурні брекети:

command && echo "Ok, continuing" || { echo "Check internet connection"; exit 1; }

Хитрість тут полягає в тому, що, на відміну від паронів, слід виконувати остаточну команду в дужках ;.

Чому потрібна крапка з комою або новою лінією

Фігурна дужка - коректний аргумент команди. Наприклад, ось фігурна дужка як аргумент echo:

$ echo }
}

Отже, якщо оболонка бачить:

{ command1; command2 }

Оболонка інтерпретує команду1 як відсутність аргументів, а команда2 як один аргумент, що складається з символу }. Фігурна дужка }інтерпретується як закриття угруповання лише в тому випадку, якщо вона слідує крапці з комою або новою лінією. Щоб зробити вищезгадану роботу:

{ command1; command2; }

Абонементи та різниця між {...}та(...)

Зауважте, що наступні набори xдо 10, але що це налаштування забуте перед запуском echoкоманди:

$ x=0; false || ( echo Hello; x=10 )
Hello
$ echo $x
0

З фігурними брекетами, навпаки, x=10пам'ятається настройка :

$ x=0; false || { echo Hello; x=10; }
Hello
$ echo $x
10

Різниця полягає в тому, що змінні присвоєння в передній оболонці не виживають після того, як допоміжна частина завершиться.

Документація

Від man bash:

(список)

список виконується в середовищі додаткової оболонки (див. КОМАНДУ ВИКОНАВЧОГО ЕКОЛОГІЇ нижче). Змінні призначення та вбудовані команди, які впливають на середовище оболонки, не залишаються в силі після завершення команди. Статус повернення - це статус виходу зі списку.

{список; }

список просто виконується в поточному середовищі оболонки. список повинен бути завершений новим рядком або крапкою з комою. Це відомо як команда групи. Статус повернення - це статус виходу зі списку. Зауважте, що на відміну від метахарактерів (і), {і} є зарезервованими словами і повинні виникати там, де дозволено розпізнавати зарезервоване слово. Оскільки вони не викликають розрив слова, їх потрібно відокремити від списку пробілом або іншим метахарактером оболонки.

[Наголос додано]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.