Я работаю над сценарием bash для создания логических томов. У меня есть команда, которую я хочу добавить, чтобы проверить, все ли они успешны. Какой самый простой способ сделать это?
#!/bin/bash
pvcreate /dev/md5
vgcreate vg0 /dev/md5
lvcreate -L 200MB vg0 -n test
#!/bin/bash
pvcreate /dev/md5 && echo "pvcreate succeeded" || echo "pvcreate failed"
vgcreate vg0 /dev/md5 && echo "vgcreate succeeded" || echo "vgcreate failed"
lvcreate -L 200MB vg0 -n test && echo "lvcreate succeeded" || echo "lvcreate failed"
Логическая часть И &&
будет выполнена только в том случае, если команда выполнена успешно (true), в противном случае будет выполнена логическая часть ИЛИ ||
(false).
#!/bin/ksh
safeRunCommand() {
typeset cmnd="$*"
typeset ret_code
echo cmnd=$cmnd
eval $cmnd
ret_code=$?
if [ $ret_code != 0 ]; then
printf "Error : [%d] when executing command: '$cmnd'" $ret_code
exit $ret_code
fi
}
command="ls -l | grep p"
safeRunCommand "$command"
Источник: StackOverFlow
Это было бы традиционно:
#!/bin/bash
pvcreate /dev/md5 || die "pvcreate failed"
vgcreate vg0 /dev/md5 || die "vgcreate failed"
lvcreate -L 200MB vg0 -n test || die "lvcreate failed"
Функция die
- это то, что вы должны определить, которая печатает сообщение об ошибке и затем завершает работу. Примером реализации может быть
die() {
echo $@ 1>&2 # print arguments of 'die' to standard error
exit 1 # exit the script
}
Когда вы делаете это так, скрипт не выдаст никакого вывода, если что-то не получится, и в этом случае он не пойдет дальше. Если вы хотите, чтобы он продолжал работать даже в случае сбоя команды, удалите строку exit
из реализации die
.
Если вы хотите получить сообщение для каждой успешной команды, вы также можете сделать это:
#!/bin/bash
if pvcreate /dev/md5; then
echo "pvcreate succeeded"
else
echo "pvcreate failed"
fi
и аналогично для двух других команд.
#!/bin/bash
if pvcreate /dev/md5
then
if vgcreate vg0 /dev/md5
then
lvcreate -L 200MB vg0 -n test
fi
fi
Не тест. Но должно работать.
Базовая структура if-else:
if condition
then
do somethin...
fi
Если перед выполнением команд все команды зависят от одной, вы можете использовать set -e
:
#!/bin/bash
set -e
pvcreate /dev/md5
vgcreate vg0 /dev/md5
lvcreate -L 200MB vg0 -n test
. Обратите внимание, что вышеприведенное будет завершено без специального сообщения о том, какая команда не выполнена.