Кажется, они оба сигнализируют BASH, чтобы начать с другой команды, следующей за символами, но есть ли разница?
Кажется, они оба сигнализируют BASH, чтобы начать с другой команды, следующей за символами, но есть ли разница?
С помощью этой строки:
command1 && command2
command2 будет выполняться, если (и только если) command1 возвращает статус завершения, но в этой строке:
command1 ; command2
как command1, так и command2 будут выполняться независимо. Точка с запятой позволяет вводить много команд в одной строке.
Вы можете попробовать разницу для себя:
ls /invalid/path && echo "hello!"
поскольку / invalid / path не существует, ls не может показать вам список каталогов. Он выйдет из строя с сообщением об ошибке: «ls: / invalid / path: Нет такого файла или каталога».
вторая половина команды (echo "hello!") никогда не выполняется , потому что первая половина не удалась.
ls /invalid/path ; echo "hello!"
Такое же сообщение об ошибке появляется, как и раньше, но на этот раз выполняется вторая часть !
ls: / invalid / path: Нет такого файла или каталога
Привет!
Почему это полезно?
Предположим, вы хотите извлечь файл с именем archive.tar.gz
Вы можете использовать команду tar zxvf archive.tar.gz && rm archive.tar.gz
.
Если по какой-либо причине извлечение архива не выполняется, вторая часть не выполняется! Вы можете попробовать еще раз.
Если вы используете; в той же ситуации архив удаляется, и вы не можете повторить попытку.
&&
AND
, что означает, что вторая команда будет выполняться только в том случае, если первая вернулась (без ошибок).
Обновление . Я добавил в качестве сценария для просмотра некоторых возможных ловушек:
Поскольку никто не упомянул «||», я буду
Update2 : некоторые важные переформулировки здесь
& Amp; & Amp; как «then» выражения «if», которое отвечает «true»
|| НЕ , как «else» в статусе «если».
|| как «то» выражения «if», которое реагирует на «ложные»
Более конкретно, & amp; & amp; тестирует $? возвращаемое значение предыдущего самого последнего выполненного оператора и передает управление оператору или подклассу сразу после & amp; & amp; ... он передает только управление, если $? правда. Р>
|| аналогичен, и его часто видно после & amp; & amp; , но он проверяет возвращаемое значение false ($?) из <предыдущей самой последней версии . NB! , Нота Бене! Заметьте, хорошо! .... если инструкция preecing является & amp; & amp; оператор, который возвращает false, когда вы ожидаете, что он будет истинным, тогда || будет реагировать на ложь, поэтому смешивание в одной строке может быть рискованным
Основная мысль, которую я пытаюсь сделать, связана с ошибкой, которую я сделал. а именно:
## [[условие]] & amp; & amp; & amp; A || B
не не ведет себя как тройной стиль C / C ++. а именно:
// (состояние) ? A: B
См. Сценарий ниже для примеров «неожиданных» результатов от «A»
Основной тест и & amp; & amp; и || оператор должен быть в одной строке ...
Запустите этот скрипт, чтобы увидеть, где все может пойти не так, когда вы используете & amp; & amp; & 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 " \%pr_e% 0 rc=$? ..&&.. condition is true" || echo " \%pr_e% 0 rc=$? ..||.. condition is false"
((1!=1)) && echo " ((1!=1)) rc=$? ..&&.. condition is true" || echo " ((1!=1)) rc=$? ..||.. condition is false"
$0 1 && echo " \%pr_e% 1 rc=$? ..&&.. condition is true" || echo " \%pr_e% 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 " \%pr_e% 0 rc=$? ..&&.. condition is true"; $0 2) || echo " \%pr_e% 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 " \%pr_e% 1 rc=$? ..&&.. condition is true"; $0 4) || echo " \%pr_e% 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 " \%pr_e% 0 rc=$? ..||.. condition is true" && echo " \%pr_e% 0 rc=$? ..&&.. condition is false"
((1!=1)) || echo " ((1!=1)) rc=$? ..||.. condition is true" && echo " ((1!=1)) rc=$? ..&&.. condition is false"
$0 1 || echo " \%pr_e% 1 rc=$? ..||.. condition is true" && echo " \%pr_e% 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 " \%pr_e% 0 rc=$? ..&&.. condition is true"; $0 2) || echo " \%pr_e% 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 " \%pr_e% 1 rc=$? ..&&.. condition is true"; $0 4) || echo " \%pr_e% 1 rc=$? ..||.. condition is false"
exit
попробовать
false && echo "hello"
и
false ; echo "hello"
см. разницу
Команда (функция, в случае скрипта) после &&
выполняется в зависимости от RETVAL первой команды (функция, в случае скрипта). Это приводит к тому, что первая команда вернет значение 0, если оно будет успешным. Мы можем проверить возвращаемое значение для выполнения дальнейших команд.