2014-02-10 2 views
2

У меня есть Баш скрипт, который делает все виды операций, пример из сценария:Bash: Как проверить, успешно ли выполнено несколько операций?

scp $workdir/$site$dom.conf [email protected]$srv13:$workdir 
    scp $workdir/$site$dom.conf [email protected]$srv179:$workdir 
    ssh [email protected]$srv13 "hostname ; service httpd restart" 
    ssh [email protected] "hostname ; service httpd restart" 
    ssh [email protected]$srv179 "hostname ; service httpd restart" 
    ssh [email protected]$srv201 "hostname ; service named restart" 

Я хочу, чтобы вернуть некоторые «операцию успешной» указание, но я хочу быть уверен, что все операции успешно завершена. Обычно я использовал if [ $? = 0 ]; then..., но я хотел знать, есть ли другой способ сделать это, поскольку запись 5x if's не похожа на способ «наименее административных усилий». Итак, есть ли другой способ для проверки кода выхода из этих 5 операций?

ответ

3

Если вам нужно сбой, если какая-либо из этих операций завершилась неудачей, просто выполните set -e в верхней части скриптов. Затем он завершится с ошибкой, как только произойдет какой-либо шаг.

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

success_count=0 
scp $workdir/$site$dom.conf [email protected]$srv13:$workdir && success_count=$((success_count+1)) 
scp $workdir/$site$dom.conf [email protected]$srv179:$workdir && success_count=$((success_count+1)) 
ssh [email protected]$srv13 "hostname ; service httpd restart" && success_count=$((success_count+1)) 
ssh [email protected] "hostname ; service httpd restart" && success_count=$((success_count+1)) 
ssh [email protected]$srv179 "hostname ; service httpd restart" && success_count=$((success_count+1)) 
ssh [email protected]$srv201 "hostname ; service named restart" && success_count=$((success_count+1)) 

echo "Num ops succeeded = $success_count" 

Вы можете даже вытащить его в функцию, как:

exec_with_count() { 
    "[email protected]" && success_count=$((success_count+1)) 
} 

exec_with_count scp $workdir/$site$dom.conf [email protected]$srv13:$workdir 
exec_with_count scp $workdir/$site$dom.conf [email protected]$srv179:$workdir 
... 

echo "Num ops succeeded = $success_count" 
3

Вы можете связать операции с помощью &&, но, возможно, вы тоже это исправили?

scp $workdir/$site$dom.conf [email protected]$srv13:$workdir && 
    scp $workdir/$site$dom.conf [email protected]$srv179:$workdir && 
    ssh [email protected]$srv13 "hostname service httpd restart" && 
    ssh [email protected] "hostname service httpd restart" && 
    ssh [email protected]$srv179 "hostname service httpd restart" && 
    ssh [email protected]$srv201 "hostname service named restart" && 
    echo "All ok" 
+1

С тех пор, как вы приковали все команды, также можно связать последнее «эхо». – devnull

+0

true :) Я сделаю редактирование –

Смежные вопросы