Есть ли разница между '&&' и ';' символы в стандартном терминале bash?

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

Но это не доказательство того, что он будет работать во всех отношениях. Это доказывает, что он МОЖЕТ работать больше всего на свете. У меня тоже не было проблем с этим.

52
задан 27 January 2011 в 22:26

66 ответов

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

8
ответ дан 31 July 2018 в 10:28
  • 1
    && это "потом" (не "И")... см. мой ответ – Peter.O 9 February 2011 в 10:34
  • 2
    @fred Я бы сказал, что это & quot; и & quot; с оценкой короткого замыкания - если первая часть неверна, она знает, что общий результат должен быть ложным, поэтому он пропускает вторую часть. Но согласитесь, что думать об этом как о "тогда" редко имеет большое значение в этом контексте. – j-g-faustus 9 February 2011 в 11:08
  • 3
    хотя @Фред концептуально это может быть легче понять, что путь, я не согласен с вашим утверждением. Идея заключается в том, что с любой AND выполнение 2-й параметр будет иметь значения, если первая равна [F2] и поэтому исходный код преобразуется отложить оценки 2-го параметра до, он знает, что первая. – Ward Muylaert 11 February 2011 в 19:20
  • 4
    @fred Я не уверен, что именно этот пример пытается сделать. && - это просто бинарный оператор, функция. Единственный "специальный" дело в том, что это нотация infix (что стандартно для большинства этих операторов), и отсроченное выполнение второго операнда. Это отсроченное выполнение действительно дает ему возможность быть использованным как нечто, которое можно концептуально рассматривать как if statement в этом контексте , но это не отменяет того факта, что оно изначально предназначено для использования в является условным для фактического оператора if. Использование здесь действительно является скорее «взломом». – Ward Muylaert 12 February 2011 в 02:34
  • 5
    @Фред, конечно, это не тернарный оператор, это просто последовательность из двух операций a && b || c = (a && b) || c. Простой порядок оценки. Нет никакой тайны нет. Если бы вы написали их как свои типичные функции, он будет просто выглядеть как or(and(a, b), c). Эта логика такая же, в if условные а также при вступлении его прямо в командной строке, потому что [F4], а || являются операторы, они берут два операнда и возвращают другой. – Ward Muylaert 12 February 2011 в 15:30

Вы можете попробовать разницу для себя:

ls /invalid/path && echo "hello!" с /недопустимый/пути не существует, ЛС не могу показать вам каталог. Он завершится с сообщением об ошибке: "ЛС: /недопустимый/путь: нет такого файла или каталога". Вторая половина команды (echo "привет!") даже никогда не выполняются, потому что в первом тайме не удалось. ls /invalid/path ; echo "hello!" появляется то же сообщение об ошибке, как и раньше, но на этот раз, вторая часть выполняется! ЛС: /недопустимый/путь: нет такого файла или каталога Здравствуйте!

почему это полезно? Предположим, вы хотите извлечь файл с названием archive.tar.gz можно использовать команду tar zxvf archive.tar.gz && rm archive.tar.gz. Если по какой-либо причине извлечения из архива не удалась, вторая часть не исполняется! Вы можете снова попробовать.

если вы используете ; в таком же положении, архив будет удален и Вы не можете снова попробовать.

40
ответ дан 31 July 2018 в 11:30

Обновление: я добавил как скрипт, чтобы увидеть некоторые из возможных ловушек:

Поскольку никто не упомянул «||», я

Обновить : некоторые важные переформулировки здесь & amp; & amp; как «то» выражения «if», которое отвечает «true»

|| НЕ нравится «else» в статусе «если» .. || как «then» выражения «if», которое отвечает на «false»

Более конкретно, & amp; & amp; тестирует $? возвращаемое значение предыдущего оператора NOT и передает управление оператору или подколе, непосредственно следуя за & amp; & amp; ... он передает только управление, если $? правда.

|| аналогичен, и его часто видно после & amp; & amp; , но он проверяет ложное возвращаемое значение ($?) из предыдущей предыдущей инструкции ... NB !, Nota Bene! Заметьте, хорошо! .... если инструкция preecing является & amp; & amp; оператор, который возвращает false, когда вы ожидаете, что он будет истинным, тогда || будет реагировать на ложное, поэтому смешение на одной линии может быть рискованным

. Основная мысль, которую я пытаюсь сделать, связана с ошибкой, которую я сделал. т.е.: ## [[condition]] & amp; & amp; & amp; A || B false не ведет себя как тройной стиль C / C ++. т.е.: // (условие)? A: B См. Сценарий ниже для примеров «неожиданных» результатов от «A»

. Основной тест и & amp; & amp; и || оператор должен быть в одной строке ...

Запустите этот скрипт, чтобы увидеть, что может случиться с ошибками при использовании & amp; & amp; & amp; и || Самый последний выполненный оператор может быть не таким, которого вы ожидаете ..

[[condition]] & amp; & amp; & amp; & amp; & amp; echo Hello || echo Goodbye .... обычно безопасно, потому что хорошо сформированное эхо возвращает true. , но как насчет доступа к файлу, который не выходит?

#!/bin/bash # # "as expected" return codes" means: expected to behave like a normal AND / OR contition test # if [[ "$1" != "" ]] ; then exit $1; fi # recursive call to return an arbitary $? value (decimal) echo echo 'test 1: All return codes are "as expected"' echo ====== ((1==1)) && echo " ((1==1)) rc=$? ..&&.. condition is true" || echo " ((1==1)) rc=$? ..||.. condition is false" $0 0 && echo " \$0 0 rc=$? ..&&.. condition is true" || echo " \$0 0 rc=$? ..||.. condition is false" ((1!=1)) && echo " ((1!=1)) rc=$? ..&&.. condition is true" || echo " ((1!=1)) rc=$? ..||.. condition is false" $0 1 && echo " \$0 1 rc=$? ..&&.. condition is true" || echo " \$0 1 rc=$? ..||.. condition is false" echo echo 'test 2: Now throw in some "unexpected" errors into the first of the &&/|| pair' echo ====== ((1==1)) && (echo " ((1==1)) rc=$? ..&&.. condition is true"; $0 1) || echo " ((1==1)) rc=$? ..||.. condition is false" $0 0 && (echo " \$0 0 rc=$? ..&&.. condition is true"; $0 2) || echo " \$0 0 rc=$? ..||.. condition is false" ((1!=1)) && (echo " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3) || echo " ((1!=1)) rc=$? ..||.. condition is false" $0 1 && (echo " \$0 1 rc=$? ..&&.. condition is true"; $0 4) || echo " \$0 1 rc=$? ..||.. condition is false" echo echo 'test 3: Now swap the order of && and || statements, using "as expected" return codes' echo ====== ((1==1)) || echo " ((1==1)) rc=$? ..||.. condition is true" && echo " ((1==1)) rc=$? ..&&.. condition is false" $0 0 || echo " \$0 0 rc=$? ..||.. condition is true" && echo " \$0 0 rc=$? ..&&.. condition is false" ((1!=1)) || echo " ((1!=1)) rc=$? ..||.. condition is true" && echo " ((1!=1)) rc=$? ..&&.. condition is false" $0 1 || echo " \$0 1 rc=$? ..||.. condition is true" && echo " \$0 1 rc=$? ..&&.. condition is false" echo echo 'test 4: With the order of && and || statements still swapped, introduce "unexpected" errors into the first of the &&/|| pair' echo ====== ((1==1)) && (echo " ((1==1)) rc=$? ..&&.. condition is true"; $0 1) || echo " ((1==1)) rc=$? ..||.. condition is false" $0 0 && (echo " \$0 0 rc=$? ..&&.. condition is true"; $0 2) || echo " \$0 0 rc=$? ..||.. condition is false" ((1!=1)) && (echo " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3) || echo " ((1!=1)) rc=$? ..||.. condition is false" $0 1 && (echo " \$0 1 rc=$? ..&&.. condition is true"; $0 4) || echo " \$0 1 rc=$? ..||.. condition is false" exit
6
ответ дан 31 July 2018 в 11:30

try

false && echo "hello"

и

false ; echo "hello"

видеть разницу

1
ответ дан 31 July 2018 в 11:30

команда (функция, в случае скрипта) после && выполняется в зависимости от РАТАВАЛІ первой команды (функция, в случае скрипта). Его сил первая команда возвращает значение 0, В случае успеха. Мы можем проверить возвращаемое значение для выполнения дальнейших команд.

0
ответ дан 31 July 2018 в 11:30

&& - AND, что означает, что вторая команда будет выполняться только в том случае, если первая возвращает true (нет ошибок).

8
ответ дан 31 July 2018 в 11:30
  • 1
    & Amp; & Amp; является "затем" (не «& quot;») ... см. мой ответ – Peter.O 9 February 2011 в 10:34
  • 2
  • 3
    хотя @Фред концептуально это может быть легче понять, что путь, я не согласен с вашим утверждением. Идея заключается в том, что с любой AND выполнение 2-й параметр будет иметь значения, если первая равна [F2] и поэтому исходный код преобразуется отложить оценки 2-го параметра до, он знает, что первая. – Ward Muylaert 11 February 2011 в 19:20
  • 4
    @fred Я не уверен, что именно этот пример пытается сделать. && - это просто бинарный оператор, функция. Единственный "специальный" дело в том, что это нотация infix (что стандартно для большинства этих операторов), и отсроченное выполнение второго операнда. Это отсроченное выполнение действительно дает ему возможность быть использованным как нечто, которое можно концептуально рассматривать как if statement в этом контексте , но это не отменяет того факта, что оно изначально предназначено для использования в является условным для фактического оператора if. Использование здесь действительно является скорее «взломом». – Ward Muylaert 12 February 2011 в 02:34
  • 5
    @fred Конечно, это не тернарный оператор, а просто последовательность двух операций a && b || c = (a && b) || c. Простой порядок оценки. Там нет никакой тайны. Если вы напишете их, как ваши типичные функции, это будет выглядеть как or(and(a, b), c). Эта логика одинакова в if условном, а также при вводе ее прямо в командную строку, потому что && и || являются операторами , они берут два операнда и возвращают другое. – Ward Muylaert 12 February 2011 в 15:30

Вы можете попробовать разницу для себя:

ls /invalid/path && echo "hello!", так как / invalid / path не существует, ls не может показать вам список каталогов. Он выйдет из строя с сообщением об ошибке: «ls: / invalid / path: Нет такого файла или каталога». Вторая половина команды (эхо «привет!») Даже не выполняется, потому что первая половина не удалась. ls /invalid/path ; echo "hello!" Такое же сообщение об ошибке появляется, как и раньше, но на этот раз выполняется вторая часть! ls: / invalid / path: Нет такого файла или каталога привет!

Почему это полезно? Предположим, вы хотите извлечь файл с именем archive.tar.gz. Вы можете использовать команду tar zxvf archive.tar.gz && rm archive.tar.gz. Если по какой-либо причине извлечение архива не выполняется, вторая часть не выполняется! Вы можете попробовать еще раз.

Если вы используете; в той же ситуации архив удаляется, и вы не можете повторить попытку.

40
ответ дан 2 August 2018 в 04:00
обновление

: я добавил в скрипт highight некоторые из возможных ловушек:

потому что никто не упомянул "||", я

обновление: некоторые важные ре-формулировка здесь && как "тогда" на "если" заявление, которое реагирует на "истинный"

|| не нравится "еще" "если" заявление.. | | - как "тогда" на "если" заявление, которое реагирует на "ложные"

более разработан, && тестирует $? возвращаемое значение предыдущий не заявление и передает управление оператору или суб-оболочки сразу после &&... он только передает управление, если $? это правда.

|| аналогично, и часто видел после && заявлением, но тесты на ложь возвращаемое значение ($?) от предыдущие самого последнего выполненного оператора... НБ!, Нота Бене! Обратите внимание!.... если утверждение вышестоящего представляет собой && оператор, который возвращает значение false, когда вы ожидаете, чтобы быть правдой, то || будет отвечать на ложь, поэтому смешивать на одной линии может быть рискованным

[dиода d17]основная мысль, которую я пытаюсь сделать это в связи с ошибкой, которую я совершил. т. е.: ## [[условие]] && А || Б ложным не ведет себя как C/С++ стиль троичной. т. е.: // (состояние) ? А : Б см. скрипт ниже для примеров "неожиданных" результатов от "А" [!dиода d17]

базовый тест и && и || утверждение все должны быть на одной линии...

Запустите этот скрипт, чтобы увидеть, где вещи могут пойти не так, когда с помощью && и || последняя выполненная инструкция не может быть тот, кого ты ждешь..

[[ условие]] && echo Привет || Эхо Прощай .... обычно безопасный, потому что хорошо сформированный Эхо возвратит True. а как насчет доступа к файлу, который не выходит?

#!/bin/bash # # "as expected" return codes" means: expected to behave like a normal AND / OR contition test # if [[ "$1" != "" ]] ; then exit $1; fi # recursive call to return an arbitary $? value (decimal) echo echo 'test 1: All return codes are "as expected"' echo ====== ((1==1)) && echo " ((1==1)) rc=$? ..&&.. condition is true" || echo " ((1==1)) rc=$? ..||.. condition is false" $0 0 && echo " \$0 0 rc=$? ..&&.. condition is true" || echo " \$0 0 rc=$? ..||.. condition is false" ((1!=1)) && echo " ((1!=1)) rc=$? ..&&.. condition is true" || echo " ((1!=1)) rc=$? ..||.. condition is false" $0 1 && echo " \$0 1 rc=$? ..&&.. condition is true" || echo " \$0 1 rc=$? ..||.. condition is false" echo echo 'test 2: Now throw in some "unexpected" errors into the first of the &&/|| pair' echo ====== ((1==1)) && (echo " ((1==1)) rc=$? ..&&.. condition is true"; $0 1) || echo " ((1==1)) rc=$? ..||.. condition is false" $0 0 && (echo " \$0 0 rc=$? ..&&.. condition is true"; $0 2) || echo " \$0 0 rc=$? ..||.. condition is false" ((1!=1)) && (echo " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3) || echo " ((1!=1)) rc=$? ..||.. condition is false" $0 1 && (echo " \$0 1 rc=$? ..&&.. condition is true"; $0 4) || echo " \$0 1 rc=$? ..||.. condition is false" echo echo 'test 3: Now swap the order of && and || statements, using "as expected" return codes' echo ====== ((1==1)) || echo " ((1==1)) rc=$? ..||.. condition is true" && echo " ((1==1)) rc=$? ..&&.. condition is false" $0 0 || echo " \$0 0 rc=$? ..||.. condition is true" && echo " \$0 0 rc=$? ..&&.. condition is false" ((1!=1)) || echo " ((1!=1)) rc=$? ..||.. condition is true" && echo " ((1!=1)) rc=$? ..&&.. condition is false" $0 1 || echo " \$0 1 rc=$? ..||.. condition is true" && echo " \$0 1 rc=$? ..&&.. condition is false" echo echo 'test 4: With the order of && and || statements still swapped, introduce "unexpected" errors into the first of the &&/|| pair' echo ====== ((1==1)) && (echo " ((1==1)) rc=$? ..&&.. condition is true"; $0 1) || echo " ((1==1)) rc=$? ..||.. condition is false" $0 0 && (echo " \$0 0 rc=$? ..&&.. condition is true"; $0 2) || echo " \$0 0 rc=$? ..||.. condition is false" ((1!=1)) && (echo " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3) || echo " ((1!=1)) rc=$? ..||.. condition is false" $0 1 && (echo " \$0 1 rc=$? ..&&.. condition is true"; $0 4) || echo " \$0 1 rc=$? ..||.. condition is false" exit
6
ответ дан 2 August 2018 в 04:00

попробовать

false && echo "hello"

и

false ; echo "hello"

вижу разницы

1
ответ дан 2 August 2018 в 04:00

команда (функция, в случае скрипта) после && выполняется в зависимости от РАТАВАЛІ первой команды (функция, в случае скрипта). Его сил первая команда возвращает значение 0, В случае успеха. Мы можем проверить возвращаемое значение для выполнения дальнейших команд.

0
ответ дан 2 August 2018 в 04:00

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

8
ответ дан 2 August 2018 в 04:00
  • 1
    & Amp; & Amp; является "затем" (не «& quot;») ... см. мой ответ – Peter.O 9 February 2011 в 10:34
  • 2
  • 3
    хотя @Фред концептуально это может быть легче понять, что путь, я не согласен с вашим утверждением. Идея заключается в том, что с любой AND выполнение 2-й параметр будет иметь значения, если первая равна [F2] и поэтому исходный код преобразуется отложить оценки 2-го параметра до, он знает, что первая. – Ward Muylaert 11 February 2011 в 19:20
  • 4
    @Фред, я не понимаю, что этот пример пытается сделать. [F1] является просто бинарный оператор, функция. Единственное "особое" дело в том, что это инфиксной нотации (что равно стандартной для такого рода операторов) и исполнение второго операнда. Что несвоевременное исполнение действительно дает ему возможность быть использованным как-то, что можно концептуально рассматривать как if заявление в этом контексте, но это не умаляет того факта, что первоначально предполагаемого использования в условный фактического if заявление. Использование здесь действительно больше "рубить". – Ward Muylaert 12 February 2011 в 02:34
  • 5
    @fred Конечно, это не тернарный оператор, а просто последовательность двух операций a && b || c = (a && b) || c. Простой порядок оценки. Там нет никакой тайны. Если вы напишете их, как ваши типичные функции, это будет выглядеть как or(and(a, b), c). Эта логика одинакова в if условном, а также при вводе ее прямо в командную строку, потому что && и || являются операторами , они берут два операнда и возвращают другое. – Ward Muylaert 12 February 2011 в 15:30

try

 false && echo "hello" 

и

 false;  echo "hello" 

видеть разницу

1
ответ дан 4 August 2018 в 20:03

Команда (функция, в случае скрипта) после & amp; & amp; выполняется в зависимости от RETVAL первой команды (функция, в случае скрипта). Это приводит к тому, что первая команда вернет значение 0, если оно будет успешным. Мы можем проверить возвращаемое значение для выполнения дальнейших команд.

0
ответ дан 4 August 2018 в 20:03

& amp; - AND , что означает, что вторая команда будет выполняться только в том случае, если первая вернулась (без ошибок).

8
ответ дан 4 August 2018 в 20:03

Обновление: я добавил как скрипт, чтобы увидеть некоторые из возможных ловушек:

Поскольку никто не упомянул «||», я

Update2: некоторые важная переформулировка здесь & amp; & amp; как «то» выражения «if», которое отвечает «true»

|| НЕ нравится «else» в статусе «если» .. || как «then» выражения «if», которое отвечает на «false»

Более конкретно, & amp; & amp; тестирует $? возвращаемое значение предыдущего последнего выполненного оператора и передает управление оператору или подчиненной оболочке сразу после & amp; & amp; ... он передает только управление, если $? правда.

|| аналогичен, и его часто видно после & amp; & amp; , но он проверяет ложное возвращаемое значение ($?) из предыдущего последнего выполненного оператора ... NB !, Nota Bene! Заметьте, хорошо! .... если инструкция preecing является & amp; & amp; оператор, который возвращает false, когда вы ожидаете, что он будет истинным, тогда || ответит на ложь, поэтому смешение на одной строке может быть рискованным

. Основная мысль, которую я пытаюсь сделать, связана с ошибкой, которую я сделал. т.е.: ## [[condition]] & amp; & amp; & amp; A || B не ведет себя как троичный стиль C / C ++. т.е.: // (условие)? A: B См. Приведенный ниже сценарий для примеров «неожиданных» результатов от «A»

. Основной тест и & amp; & amp; & amp; и || оператор должен быть в одной строке ...


Запустите этот скрипт, чтобы увидеть, что может случиться с ошибками при использовании & amp; & amp; & amp; и || Последняя выполненная инструкция может быть не той, которую вы ожидаете ..

[[condition]] & amp; & amp; & amp; & amp; & amp; echo Hello || эхо До свидания .... обычно безопасно, потому что хорошо сформированное эхо вернется. но как насчет доступа к файлу, который не выходит?

  #! / bin / bash # # ", как и ожидалось," коды возврата "означает: ожидается, что он будет вести себя как нормальный И / ИЛИ-тест #, если [[" $ 1 "! =" "]  ], затем выйдите из рекурсивного вызова $ 1; fi #, чтобы вернуть двоичное значение $ (значение десятичного) echo echo 'test 1: все коды возврата «как ожидалось»' echo ====== ((1 == 1))  & amp; echo "((1 == 1)) rc = $?  .. & amp; & amp; .. условие истинно "|| echo" ((1 == 1)) rc = $?  .. || .. условие ложно "$ 0 0 & amp; echo" \ $ 0 0 rc = $?  .. & amp; & ... условие истинно "|| echo" \ $ 0 0 rc = $?  .. || .. условие ложно "((1! = 1)) & amp; echo" ((1! = 1)) rc = $?  ... & amp; ... условие истинно "|| echo" ((1! = 1)) rc = $?  .. || .. условие ложно "$ 0 1 & amp; & amcho; echo" \ $ 0 1 rc = $?  .. & amp; & amp; ... условие истинно "|| echo" \ $ 0 1 rc = $?  .. || .. условие является ложным «echo echo» test 2: теперь введите некоторые «неожиданные» ошибки в первую из пары & amp; & amp; / || pair echo ====== ((1 ==  1)) & amp; & amp; (echo "((1 == 1)) rc = $? .. & amp; & amp; ... условие истинно", $ 0 1) || echo "((1 == 1))  гс = $?  .. || .. условие ложно "$ 0 0 & amp; & amp; (echo" \ $ 0 0 rc = $? .. & amp; & amp; .. условие истинно ", $ 0 2) || echo" \ $ 0 0 rc  = $?  ... || .. условие ложно "((1! = 1)) & amp; & amp; (echo" ((1! = 1)) rc = $? .. & amp; & amp; ... условие истинно ";  $ 0 3) || echo "((1! = 1)) rc = $?  .. || .. условие ложно "$ 0 1 & amp; & amp; (echo" \ $ 0 1 rc = $? .. & amp; & amp; .. условие истинно ", $ 0 4) || echo" \ $ 0 1 rc  = $?  .. || .. условие является ложным «echo echo» test 3: Теперь замените порядок операторов & amp; & amp; и ||, используя «как ожидалось» эхо-коды возврата ====== ((1 ==)  1)) || echo "((1 == 1)) rc = $?  .. || .. условие истинно "& amp; & amp; echo" ((1 == 1)) rc = $?  .. & amp; & amp; .. условие ложно "$ 0 0 || echo" \ $ 0 0 rc = $?  .. || .. условие истинно "& amp; & amcho; echo" \ $ 0 0 rc = $?  .. & amp; & amp; .. условие является ложным "((1! = 1)) || echo" ((1! = 1)) rc = $?  .. || .. условие истинно "& amp; & amp; echo" ((1! = 1)) rc = $?  .. & amp; & amp; .. условие ложно "$ 0 1 || echo" \ $ 0 1 rc = $?  .. || .. условие истинно "& amp; & amcho; echo" \ $ 0 1 rc = $?  .. & amp; & amp; .. Условие является ложным «echo echo» test 4: Когда порядок операторов & amp; & amp; и || все еще заменен, вводят «неожиданные» ошибки в первую из & amp; / ||  pair 'echo ====== ((1 == 1)) & amp; & amp; (echo "((1 == 1)) rc = $? .. & amp; & amp; .. условие истинно"; $ 0  1) || echo "((1 == 1)) rc = $?  .. || .. условие ложно "$ 0 0 & amp; & amp; (echo" \ $ 0 0 rc = $? .. & amp; & amp; .. условие истинно ", $ 0 2) || echo" \ $ 0 0 rc  = $?  ... || .. условие ложно "((1! = 1)) & amp; & amp; (echo" ((1! = 1)) rc = $? .. & amp; & amp; ... условие истинно ";  $ 0 3) || echo "((1! = 1)) rc = $?  .. || .. условие ложно "$ 0 1 & amp; & amp; (echo" \ $ 0 1 rc = $? .. & amp; & amp; .. условие истинно ", $ 0 4) || echo" \ $ 0 1 rc  = $?  .. || .. условие ложно "exit  

6
ответ дан 4 August 2018 в 20:03

Вы можете попробовать разницу для себя:

  1. ls / invalid / path & amp; & amp; & amp; & amp; echo «hello!» , поскольку / invalid / path не существует, ls не может показать вам список каталогов. Он выйдет из строя с сообщением об ошибке: «ls: / invalid / path: Нет такого файла или каталога». Вторая половина команды (echo «hello!») Никогда не выполняется, потому что первая половина не удалась.
  2. ls / invalid / path; echo "hello!" Такое же сообщение об ошибке появляется, как и раньше, но на этот раз выполняется вторая часть! ls: / invalid / path: Нет такого файла или каталога привет!

Почему это полезно? Предположим, вы хотите извлечь файл с именем archive.tar.gz. Вы можете использовать команду tar zxvf archive.tar.gz & amp; & amp; & amp; rm archive.tar.gz . Если по какой-либо причине извлечение архива не выполняется, вторая часть не выполняется! Вы можете попробовать еще раз.

Если вы используете; в той же ситуации архив удаляется, и вы не можете повторить попытку.

40
ответ дан 4 August 2018 в 20:03

& amp; - AND , что означает, что вторая команда будет выполняться только в том случае, если первая вернулась (без ошибок).

8
ответ дан 6 August 2018 в 04:04

try

 false && echo "hello" 

и

 false;  echo "hello" 

видеть разницу

1
ответ дан 6 August 2018 в 04:04

Команда (функция, в случае скрипта) после & amp; & amp; выполняется в зависимости от RETVAL первой команды (функция, в случае скрипта). Это приводит к тому, что первая команда вернет значение 0, если оно будет успешным. Мы можем проверить возвращаемое значение для выполнения дальнейших команд.

0
ответ дан 6 August 2018 в 04:04

Вы можете попробовать разницу для себя:

  1. ls / invalid / path & amp; & amp; & amp; & amp; echo «hello!» , поскольку / invalid / path не существует, ls не может показать вам список каталогов. Он выйдет из строя с сообщением об ошибке: «ls: / invalid / path: Нет такого файла или каталога». Вторая половина команды (echo «hello!») Никогда не выполняется, потому что первая половина не удалась.
  2. ls / invalid / path; echo "hello!" Такое же сообщение об ошибке появляется, как и раньше, но на этот раз выполняется вторая часть! ls: / invalid / path: Нет такого файла или каталога привет!

Почему это полезно? Предположим, вы хотите извлечь файл с именем archive.tar.gz. Вы можете использовать команду tar zxvf archive.tar.gz & amp; & amp; & amp; rm archive.tar.gz . Если по какой-либо причине извлечение архива не выполняется, вторая часть не выполняется! Вы можете попробовать еще раз.

Если вы используете; в той же ситуации архив удаляется, и вы не можете повторить попытку.

40
ответ дан 6 August 2018 в 04:04

Обновление: я добавил как скрипт, чтобы увидеть некоторые из возможных ловушек:

Поскольку никто не упомянул «||», я

Update2: некоторые важная переформулировка здесь & amp; & amp; как «то» выражения «if», которое отвечает «true»

|| НЕ нравится «else» в статусе «если» .. || как «then» выражения «if», которое отвечает на «false»

Более конкретно, & amp; & amp; тестирует $? возвращаемое значение предыдущего последнего выполненного оператора и передает управление оператору или подчиненной оболочке сразу после & amp; & amp; ... он передает только управление, если $? правда.

|| аналогичен, и его часто видно после & amp; & amp; , но он проверяет ложное возвращаемое значение ($?) из предыдущего последнего выполненного оператора ... NB !, Nota Bene! Заметьте, хорошо! .... если инструкция preecing является & amp; & amp; оператор, который возвращает false, когда вы ожидаете, что он будет истинным, тогда || ответит на ложь, поэтому смешение на одной строке может быть рискованным

. Основная мысль, которую я пытаюсь сделать, связана с ошибкой, которую я сделал. т.е.: ## [[condition]] & amp; & amp; & amp; A || B не ведет себя как троичный стиль C / C ++. т.е.: // (условие)? A: B См. Приведенный ниже сценарий для примеров «неожиданных» результатов от «A»

. Основной тест и & amp; & amp; & amp; и || оператор должен быть в одной строке ...


Запустите этот скрипт, чтобы увидеть, что может случиться с ошибками при использовании & amp; & amp; & amp; и || Последняя выполненная инструкция может быть не той, которую вы ожидаете ..

[[condition]] & amp; & amp; & amp; & amp; & amp; echo Hello || эхо До свидания .... обычно безопасно, потому что хорошо сформированное эхо вернется. но как насчет доступа к файлу, который не выходит?

  #! / bin / bash # # ", как и ожидалось," коды возврата "означает: ожидается, что он будет вести себя как нормальный И / ИЛИ-тест #, если [[" $ 1 "! =" "]  ], затем выйдите из рекурсивного вызова $ 1; fi #, чтобы вернуть двоичное значение $ (значение десятичного) echo echo 'test 1: все коды возврата «как ожидалось»' echo ====== ((1 == 1))  & amp; echo "((1 == 1)) rc = $?  .. & amp; & amp; .. условие истинно "|| echo" ((1 == 1)) rc = $?  .. || .. условие ложно "$ 0 0 & amp; echo" \ $ 0 0 rc = $?  .. & amp; & ... условие истинно "|| echo" \ $ 0 0 rc = $?  .. || .. условие ложно "((1! = 1)) & amp; echo" ((1! = 1)) rc = $?  ... & amp; ... условие истинно "|| echo" ((1! = 1)) rc = $?  .. || .. условие ложно "$ 0 1 & amp; & amcho; echo" \ $ 0 1 rc = $?  .. & amp; & amp; ... условие истинно "|| echo" \ $ 0 1 rc = $?  .. || .. условие является ложным «echo echo» test 2: теперь введите некоторые «неожиданные» ошибки в первую из пары & amp; & amp; / || pair echo ====== ((1 ==  1)) & amp; & amp; (echo "((1 == 1)) rc = $? .. & amp; & amp; ... условие истинно", $ 0 1) || echo "((1 == 1))  гс = $?  .. || .. условие ложно "$ 0 0 & amp; & amp; (echo" \ $ 0 0 rc = $? .. & amp; & amp; .. условие истинно ", $ 0 2) || echo" \ $ 0 0 rc  = $?  ... || .. условие ложно "((1! = 1)) & amp; & amp; (echo" ((1! = 1)) rc = $? .. & amp; & amp; ... условие истинно ";  $ 0 3) || echo "((1! = 1)) rc = $?  .. || .. условие ложно "$ 0 1 & amp; & amp; (echo" \ $ 0 1 rc = $? .. & amp; & amp; .. условие истинно ", $ 0 4) || echo" \ $ 0 1 rc  = $?  .. || .. условие является ложным «echo echo» test 3: Теперь замените порядок операторов & amp; & amp; и ||, используя «как ожидалось» эхо-коды возврата ====== ((1 ==)  1)) || echo "((1 == 1)) rc = $?  .. || .. условие истинно "& amp; & amp; echo" ((1 == 1)) rc = $?  .. & amp; & amp; .. условие ложно "$ 0 0 || echo" \ $ 0 0 rc = $?  .. || .. условие истинно "& amp; & amcho; echo" \ $ 0 0 rc = $?  .. & amp; & amp; .. условие является ложным "((1! = 1)) || echo" ((1! = 1)) rc = $?  .. || .. условие истинно "& amp; & amp; echo" ((1! = 1)) rc = $?  .. & amp; & amp; .. условие ложно "$ 0 1 || echo" \ $ 0 1 rc = $?  .. || .. условие истинно "& amp; & amcho; echo" \ $ 0 1 rc = $?  .. & amp; & amp; .. Условие является ложным «echo echo» test 4: Когда порядок операторов & amp; & amp; и || все еще заменен, вводят «неожиданные» ошибки в первую из & amp; / ||  pair 'echo ====== ((1 == 1)) & amp; & amp; (echo "((1 == 1)) rc = $? .. & amp; & amp; .. условие истинно"; $ 0  1) || echo "((1 == 1)) rc = $?  .. || .. условие ложно "$ 0 0 & amp; & amp; (echo" \ $ 0 0 rc = $? .. & amp; & amp; .. условие истинно ", $ 0 2) || echo" \ $ 0 0 rc  = $?  ... || .. условие ложно "((1! = 1)) & amp; & amp; (echo" ((1! = 1)) rc = $? .. & amp; & amp; ... условие истинно ";  $ 0 3) || echo "((1! = 1)) rc = $?  .. || .. условие ложно "$ 0 1 & amp; & amp; (echo" \ $ 0 1 rc = $? .. & amp; & amp; .. условие истинно ", $ 0 4) || echo" \ $ 0 1 rc  = $?  .. || .. условие ложно "exit  

6
ответ дан 6 August 2018 в 04:04

try

 false && echo "hello" 

и

 false;  echo "hello" 

видеть разницу

1
ответ дан 7 August 2018 в 22:04

Команда (функция, в случае скрипта) после & amp; & amp; выполняется в зависимости от RETVAL первой команды (функция, в случае скрипта). Это приводит к тому, что первая команда вернет значение 0, если оно будет успешным. Мы можем проверить возвращаемое значение для выполнения дальнейших команд.

0
ответ дан 7 August 2018 в 22:04

& amp; - AND , что означает, что вторая команда будет выполняться только в том случае, если первая вернулась (без ошибок).

8
ответ дан 7 August 2018 в 22:04

Обновление: я добавил как скрипт, чтобы увидеть некоторые из возможных ловушек:

Поскольку никто не упомянул «||», я

Update2: некоторые важная переформулировка здесь & amp; & amp; как «то» выражения «if», которое отвечает «true»

|| НЕ нравится «else» в статусе «если» .. || как «then» выражения «if», которое отвечает на «false»

Более конкретно, & amp; & amp; тестирует $? возвращаемое значение предыдущего последнего выполненного оператора и передает управление оператору или подчиненной оболочке сразу после & amp; & amp; ... он передает только управление, если $? правда.

|| аналогичен, и его часто видно после & amp; & amp; , но он проверяет ложное возвращаемое значение ($?) из предыдущего последнего выполненного оператора ... NB !, Nota Bene! Заметьте, хорошо! .... если инструкция preecing является & amp; & amp; оператор, который возвращает false, когда вы ожидаете, что он будет истинным, тогда || ответит на ложь, поэтому смешение на одной строке может быть рискованным

. Основная мысль, которую я пытаюсь сделать, связана с ошибкой, которую я сделал. т.е.: ## [[condition]] & amp; & amp; & amp; A || B не ведет себя как троичный стиль C / C ++. т.е.: // (условие)? A: B См. Приведенный ниже сценарий для примеров «неожиданных» результатов от «A»

. Основной тест и & amp; & amp; & amp; и || оператор должен быть в одной строке ...


Запустите этот скрипт, чтобы увидеть, что может случиться с ошибками при использовании & amp; & amp; & amp; и || Последняя выполненная инструкция может быть не той, которую вы ожидаете ..

[[condition]] & amp; & amp; & amp; & amp; & amp; echo Hello || эхо До свидания .... обычно безопасно, потому что хорошо сформированное эхо вернется. но как насчет доступа к файлу, который не выходит?

  #! / bin / bash # # ", как и ожидалось," коды возврата "означает: ожидается, что он будет вести себя как нормальный И / ИЛИ-тест #, если [[" $ 1 "! =" "]  ], затем выйдите из рекурсивного вызова $ 1; fi #, чтобы вернуть двоичное значение $ (значение десятичного) echo echo 'test 1: все коды возврата «как ожидалось»' echo ====== ((1 == 1))  & amp; echo "((1 == 1)) rc = $?  .. & amp; & amp; .. условие истинно "|| echo" ((1 == 1)) rc = $?  .. || .. условие ложно "$ 0 0 & amp; echo" \ $ 0 0 rc = $?  .. & amp; & ... условие истинно "|| echo" \ $ 0 0 rc = $?  .. || .. условие ложно "((1! = 1)) & amp; echo" ((1! = 1)) rc = $?  ... & amp; ... условие истинно "|| echo" ((1! = 1)) rc = $?  .. || .. условие ложно "$ 0 1 & amp; & amcho; echo" \ $ 0 1 rc = $?  .. & amp; & amp; ... условие истинно "|| echo" \ $ 0 1 rc = $?  .. || .. условие является ложным «echo echo» test 2: теперь введите некоторые «неожиданные» ошибки в первую из пары & amp; & amp; / || pair echo ====== ((1 ==  1)) & amp; & amp; (echo "((1 == 1)) rc = $? .. & amp; & amp; ... условие истинно", $ 0 1) || echo "((1 == 1))  гс = $?  .. || .. условие ложно "$ 0 0 & amp; & amp; (echo" \ $ 0 0 rc = $? .. & amp; & amp; .. условие истинно ", $ 0 2) || echo" \ $ 0 0 rc  = $?  ... || .. условие ложно "((1! = 1)) & amp; & amp; (echo" ((1! = 1)) rc = $? .. & amp; & amp; ... условие истинно ";  $ 0 3) || echo "((1! = 1)) rc = $?  .. || .. условие ложно "$ 0 1 & amp; & amp; (echo" \ $ 0 1 rc = $? .. & amp; & amp; .. условие истинно ", $ 0 4) || echo" \ $ 0 1 rc  = $?  .. || .. условие является ложным «echo echo» test 3: Теперь замените порядок операторов & amp; & amp; и ||, используя «как ожидалось» эхо-коды возврата ====== ((1 ==)  1)) || echo "((1 == 1)) rc = $?  .. || .. условие истинно "& amp; & amp; echo" ((1 == 1)) rc = $?  .. & amp; & amp; .. условие ложно "$ 0 0 || echo" \ $ 0 0 rc = $?  .. || .. условие истинно "& amp; & amcho; echo" \ $ 0 0 rc = $?  .. & amp; & amp; .. условие является ложным "((1! = 1)) || echo" ((1! = 1)) rc = $?  .. || .. условие истинно "& amp; & amp; echo" ((1! = 1)) rc = $?  .. & amp; & amp; .. условие ложно "$ 0 1 || echo" \ $ 0 1 rc = $?  .. || .. условие истинно "& amp; & amcho; echo" \ $ 0 1 rc = $?  .. & amp; & amp; .. Условие является ложным «echo echo» test 4: Когда порядок операторов & amp; & amp; и || все еще заменен, вводят «неожиданные» ошибки в первую из & amp; / ||  pair 'echo ====== ((1 == 1)) & amp; & amp; (echo "((1 == 1)) rc = $? .. & amp; & amp; .. условие истинно"; $ 0  1) || echo "((1 == 1)) rc = $?  .. || .. условие ложно "$ 0 0 & amp; & amp; (echo" \ $ 0 0 rc = $? .. & amp; & amp; .. условие истинно ", $ 0 2) || echo" \ $ 0 0 rc  = $?  ... || .. условие ложно "((1! = 1)) & amp; & amp; (echo" ((1! = 1)) rc = $? .. & amp; & amp; ... условие истинно ";  $ 0 3) || echo "((1! = 1)) rc = $?  .. || .. условие ложно "$ 0 1 & amp; & amp; (echo" \ $ 0 1 rc = $? .. & amp; & amp; .. условие истинно ", $ 0 4) || echo" \ $ 0 1 rc  = $?  .. || .. условие ложно "exit  

6
ответ дан 7 August 2018 в 22:04

Вы можете попробовать разницу для себя:

  1. ls / invalid / path & amp; & amp; & amp; & amp; echo «hello!» , поскольку / invalid / path не существует, ls не может показать вам список каталогов. Он выйдет из строя с сообщением об ошибке: «ls: / invalid / path: Нет такого файла или каталога». Вторая половина команды (echo «hello!») Никогда не выполняется, потому что первая половина не удалась.
  2. ls / invalid / path; echo "hello!" Такое же сообщение об ошибке появляется, как и раньше, но на этот раз выполняется вторая часть! ls: / invalid / path: Нет такого файла или каталога привет!

Почему это полезно? Предположим, вы хотите извлечь файл с именем archive.tar.gz. Вы можете использовать команду tar zxvf archive.tar.gz & amp; & amp; & amp; rm archive.tar.gz . Если по какой-либо причине извлечение архива не выполняется, вторая часть не выполняется! Вы можете попробовать еще раз.

Если вы используете; в той же ситуации архив удаляется, и вы не можете повторить попытку.

40
ответ дан 7 August 2018 в 22:04

& amp; - AND , что означает, что вторая команда будет выполняться только в том случае, если первая вернулась (без ошибок).

8
ответ дан 10 August 2018 в 10:18

try

 false && echo "hello" 

и

 false;  echo "hello" 

видеть разницу

1
ответ дан 10 August 2018 в 10:18

Команда (функция, в случае скрипта) после & amp; & amp; выполняется в зависимости от RETVAL первой команды (функция, в случае скрипта). Это приводит к тому, что первая команда вернет значение 0, если оно будет успешным. Мы можем проверить возвращаемое значение для выполнения дальнейших команд.

0
ответ дан 10 August 2018 в 10:18

Обновление: я добавил как скрипт, чтобы увидеть некоторые из возможных ловушек:

Поскольку никто не упомянул «||», я

Update2: некоторые важная переформулировка здесь & amp; & amp; как «то» выражения «if», которое отвечает «true»

|| НЕ нравится «else» в статусе «если» .. || как «then» выражения «if», которое отвечает на «false»

Более конкретно, & amp; & amp; тестирует $? возвращаемое значение предыдущего последнего выполненного оператора и передает управление оператору или подчиненной оболочке сразу после & amp; & amp; ... он передает только управление, если $? правда.

|| аналогичен, и его часто видно после & amp; & amp; , но он проверяет ложное возвращаемое значение ($?) из предыдущего последнего выполненного оператора ... NB !, Nota Bene! Заметьте, хорошо! .... если инструкция preecing является & amp; & amp; оператор, который возвращает false, когда вы ожидаете, что он будет истинным, тогда || ответит на ложь, поэтому смешение на одной строке может быть рискованным

. Основная мысль, которую я пытаюсь сделать, связана с ошибкой, которую я сделал. т.е.: ## [[condition]] & amp; & amp; & amp; A || B не ведет себя как троичный стиль C / C ++. т.е.: // (условие)? A: B См. Приведенный ниже сценарий для примеров «неожиданных» результатов от «A»

. Основной тест и & amp; & amp; & amp; и || оператор должен быть в одной строке ...


Запустите этот скрипт, чтобы увидеть, что может случиться с ошибками при использовании & amp; & amp; & amp; и || Последняя выполненная инструкция может быть не той, которую вы ожидаете ..

[[condition]] & amp; & amp; & amp; & amp; & amp; echo Hello || эхо До свидания .... обычно безопасно, потому что хорошо сформированное эхо вернется. но как насчет доступа к файлу, который не выходит?

  #! / bin / bash # # ", как и ожидалось," коды возврата "означает: ожидается, что он будет вести себя как нормальный И / ИЛИ-тест #, если [[" $ 1 "! =" "]  ], затем выйдите из рекурсивного вызова $ 1; fi #, чтобы вернуть двоичное значение $ (значение десятичного) echo echo 'test 1: все коды возврата «как ожидалось»' echo ====== ((1 == 1))  & amp; echo "((1 == 1)) rc = $?  .. & amp; & amp; .. условие истинно "|| echo" ((1 == 1)) rc = $?  .. || .. условие ложно "$ 0 0 & amp; echo" \ $ 0 0 rc = $?  .. & amp; & ... условие истинно "|| echo" \ $ 0 0 rc = $?  .. || .. условие ложно "((1! = 1)) & amp; echo" ((1! = 1)) rc = $?  ... & amp; ... условие истинно "|| echo" ((1! = 1)) rc = $?  .. || .. условие ложно "$ 0 1 & amp; & amcho; echo" \ $ 0 1 rc = $?  .. & amp; & amp; ... условие истинно "|| echo" \ $ 0 1 rc = $?  .. || .. условие является ложным «echo echo» test 2: теперь введите некоторые «неожиданные» ошибки в первую из пары & amp; & amp; / || pair echo ====== ((1 ==  1)) & amp; & amp; (echo "((1 == 1)) rc = $? .. & amp; & amp; ... условие истинно", $ 0 1) || echo "((1 == 1))  гс = $?  .. || .. условие ложно "$ 0 0 & amp; & amp; (echo" \ $ 0 0 rc = $? .. & amp; & amp; .. условие истинно ", $ 0 2) || echo" \ $ 0 0 rc  = $?  ... || .. условие ложно "((1! = 1)) & amp; & amp; (echo" ((1! = 1)) rc = $? .. & amp; & amp; ... условие истинно ";  $ 0 3) || echo "((1! = 1)) rc = $?  .. || .. условие ложно "$ 0 1 & amp; & amp; (echo" \ $ 0 1 rc = $? .. & amp; & amp; .. условие истинно ", $ 0 4) || echo" \ $ 0 1 rc  = $?  .. || .. условие является ложным «echo echo» test 3: Теперь замените порядок операторов & amp; & amp; и ||, используя «как ожидалось» эхо-коды возврата ====== ((1 ==)  1)) || echo "((1 == 1)) rc = $?  .. || .. условие истинно "& amp; & amp; echo" ((1 == 1)) rc = $?  .. & amp; & amp; .. условие ложно "$ 0 0 || echo" \ $ 0 0 rc = $?  .. || .. условие истинно "& amp; & amcho; echo" \ $ 0 0 rc = $?  .. & amp; & amp; .. условие является ложным "((1! = 1)) || echo" ((1! = 1)) rc = $?  .. || .. условие истинно "& amp; & amp; echo" ((1! = 1)) rc = $?  .. & amp; & amp; .. условие ложно "$ 0 1 || echo" \ $ 0 1 rc = $?  .. || .. условие истинно "& amp; & amcho; echo" \ $ 0 1 rc = $?  .. & amp; & amp; .. Условие является ложным «echo echo» test 4: Когда порядок операторов & amp; & amp; и || все еще заменен, вводят «неожиданные» ошибки в первую из & amp; / ||  pair 'echo ====== ((1 == 1)) & amp; & amp; (echo "((1 == 1)) rc = $? .. & amp; & amp; .. условие истинно"; $ 0  1) || echo "((1 == 1)) rc = $?  .. || .. условие ложно "$ 0 0 & amp; & amp; (echo" \ $ 0 0 rc = $? .. & amp; & amp; .. условие истинно ", $ 0 2) || echo" \ $ 0 0 rc  = $?  ... || .. условие ложно "((1! = 1)) & amp; & amp; (echo" ((1! = 1)) rc = $? .. & amp; & amp; ... условие истинно ";  $ 0 3) || echo "((1! = 1)) rc = $?  .. || .. условие ложно "$ 0 1 & amp; & amp; (echo" \ $ 0 1 rc = $? .. & amp; & amp; .. условие истинно ", $ 0 4) || echo" \ $ 0 1 rc  = $?  .. || .. условие ложно "exit  

6
ответ дан 10 August 2018 в 10:18

Другие вопросы по тегам:

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