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

Похоже, они оба сигнализируют, что BASH начинается с другой команды, следующей за символами, но есть ли четкая разница?

6 ответов

Решение

С этой строкой:

command1 && command2

Команда2 будет выполнена, если (и только если) Команда1 вернет нулевой статус выхода, тогда как в этой строке:

command1 ; command2

и command1, и command2 будут выполняться независимо. Точка с запятой позволяет вводить много команд в одной строке.

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

  1. ls /invalid/path && 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 && rm archive.tar.gz,
Если по какой-либо причине извлечение архива не удалось, вторая часть не выполняется! Вы можете попробовать еще раз.

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

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

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

Поскольку никто не упомянул "||", я буду

Обновление 2: некоторые важные переписки здесь
&& походит на "тогда" оператора "если", который отвечает "истинно"

|| НЕ похож на "еще" из "если"
|| это как "тогда" из "если" утверждение, которое отвечает на "ложь"

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

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

Главное, что я пытаюсь сделать, связано с ошибкой, которую я сделал. то есть:
## [[условие]] && A || В
is not не ведет себя как троица в стиле C/C++. то есть:
// (состояние)? A: B
Смотрите сценарий ниже для примеров "неожиданных" результатов от "A"

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


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

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

#!/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 

Пытаться

false && echo "привет"

а также

ложный; эхо "привет"

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

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

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