Баш, если больше команд верно, тогда хорошо

можно сделать что-то подобное?

if
rsync $folder/coopshop/prod $folder2/coopshop
rsync $folder/coopweb/prod $folder2/coopweb
rsync $folder/unihobbyshop/shop $folder2/unihobbyshop
rsync $folder/unnihobbyweb/web $folder2/unihobbyweb
then
  echo "OK! rsync done!"
else
  echo "Error! rsync crashed!"
fi

Я знаю, что есть возможность делать с символом в конце строки, но это не совсем элегантное решение. Есть ли лучший способ сделать это?

Спасибо.

0
задан 28 June 2019 в 18:25

4 ответа

попробуйте этот синтаксис:

if (cmd1) && (cmd2) && (cmd3) && (cmd4)
then
  echo "OK! rsync done!"
else
  echo "Error! rsync crashed!"
fi
0
ответ дан 28 June 2019 в 18:25

Рассмотреть set -e.

Если это будет в сценарии, то Вы, вероятно, захотите удалить if...then полностью и просто помещенный set -e наверху сценария. Это заставляет сценарий сразу остановиться, если какая-либо команда перестала работать. Когда любой из тех rsync сбой команд, они отобразят сообщения об ошибках, объясняющие отказ, таким образом, Вы, вероятно, не должны будете писать свое собственное сообщение вообще.

Если Вы хотите показать команды, которые выполняются прежде, чем выполнить их, используют set -x. Можно объединить два путем записи set -ex.

С &&, Вам не нужно \.

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

Если Вы пишете && оператор в конце строки, затем Вы не должны писать \ указывать продолжение строки. Команда не может закончиться в && (логичный И) или || (логичный ИЛИ), таким образом, оболочка продолжит анализировать на следующую строку.

if
    rsync "$folder/coopshop/prod" "$folder2/coopshop" &&
    rsync "$folder/coopweb/prod" "$folder2/coopweb" &&
    rsync "$folder/unihobbyshop/shop" "$folder2/unihobbyshop" &&
    rsync "$folder/unnihobbyweb/web" "$folder2/unihobbyweb"
then
    echo 'OK! rsync commands completed successfully!'
else
    echo 'Error! some rsync command failed!'
fi

Вы не должны помещать && в конце строки. Можно записать несколько команд на той же строке, разделенной && если Вам нравится.

Обратите внимание, что заключительная протестированная команда не заканчивается && потому что && разделяет команды. Если какая-либо команда перестанет работать, то другие не будут работать.

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

Можно вместо этого хотеть работать весь rsync команды, даже если некоторые из них перестали работать, то тестируют, если какой-либо из них неудавшийся и работает соответственно. Для этого можно захватить ERR. Это не фактический сигнал, но ERR signal_spec в выгодах удара управляет что сбой по любой причине, включая катастрофический отказ (и включая SIGINT). См. ответ pLumo (но опустить set -e продолжать идти) и это сообщение William Pursell; для более общей информации посмотрите вывод help trap.

Путем мне нравится делать это (с командами как Ваши, включил):

failed=
trap 'failed=yes' ERR

rsync "$folder/coopshop/prod" "$folder2/coopshop"
rsync "$folder/coopweb/prod" "$folder2/coopweb"
rsync "$folder/unihobbyshop/shop" "$folder2/unihobbyshop"
rsync "$folder/unnihobbyweb/web" "$folder2/unihobbyweb"

if [ -z "$failed" ]; then
    echo 'OK! rsync commands completed successfully!'
else
    echo 'Error! some rsync command failed!'
fi

О других изменениях я сделал... и что if command действительно тесты.

Ваши аргументы rsync используйте расширение параметра, таким образом, я брал на себя смелость двойного заключения в кавычки их. Иначе разделение слова и globbing будут выполнены. От контекста кажется, что Вы не хотите те дополнительные расширения. (Обычно Вы не делаете.)

Обратите внимание, что вопреки сообщению Ваша печать сценария Вы на самом деле не тестируете если любой rsync команда разрушается. Вы вместо этого тестируете если любой rsync команда перестала работать. Катастрофический отказ является аварийным завершением программы, где процесс завершается сигналом, обычно из-за ошибки или условия, которое не может быть обоснованно обработано. Это намного более редко, чем нормальное завершение программы, которое может самостоятельно произойти со статусом выхода, указывающим на успех (нуль) или отказ (некоторое другое число). Если rsync действительно отказывает, код выше поймает это также. Но большая часть того, что это ловит, на практике, является нормальным завершением программы с отказом указания статуса выхода.

4
ответ дан 24 October 2019 в 02:01

Для сценария как Ваш я не использовал бы if/else, но включите выход на ошибке (set -e) и захват.

Что-то вроде этого:

#!/bin/bash

set -euo pipefail
trap 'echo "Error! rsync crashed!"' ERR INT

rsync $folder/coopshop/prod $folder2/coopshop
rsync $folder/coopweb/prod $folder2/coopweb
rsync $folder/unihobbyshop/shop $folder2/unihobbyshop
rsync $folder/unnihobbyweb/web $folder2/unihobbyweb

echo "OK! rsync done!"
2
ответ дан 24 October 2019 в 02:01

Я попробовал это.

commands=$(
mkdir 1
mkdir 2
)

if($commands); then
  echo 'Ok.'
else
  echo 'False.'
fi

Работает. Проблема состоит в том, когда я добавляю, например, ls - la к командам, она перестала работать с этим.

./test: line 7: total: command not found

Я не знаю почему.

-1
ответ дан 24 October 2019 в 02:01

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

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