можно сделать что-то подобное?
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
Я знаю, что есть возможность делать с символом в конце строки, но это не совсем элегантное решение. Есть ли лучший способ сделать это?
Спасибо.
попробуйте этот синтаксис:
if (cmd1) && (cmd2) && (cmd3) && (cmd4)
then
echo "OK! rsync done!"
else
echo "Error! rsync crashed!"
fi
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
действительно отказывает, код выше поймает это также. Но большая часть того, что это ловит, на практике, является нормальным завершением программы с отказом указания статуса выхода.
Для сценария как Ваш я не использовал бы 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!"
Я попробовал это.
commands=$(
mkdir 1
mkdir 2
)
if($commands); then
echo 'Ok.'
else
echo 'False.'
fi
Работает. Проблема состоит в том, когда я добавляю, например, ls - la к командам, она перестала работать с этим.
./test: line 7: total: command not found
Я не знаю почему.