Если для команды проверить, если это удалось

4

Я работаю над сценарием bash для создания логических томов. У меня есть команда, которую я хочу добавить, чтобы проверить, все ли они успешны. Какой самый простой способ сделать это?

 #!/bin/bash
 pvcreate /dev/md5

vgcreate vg0 /dev/md5

lvcreate -L 200MB vg0 -n test
user3185936
источник

Ответы:

6
#!/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).

Авинаш Радж
источник
не удалось ? Это не звучит хорошо для моих ушей. Я бы пошел на провал .
nyuszika7h
1
#!/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

m0rg4n
источник
1

Это было бы традиционным:

#!/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

и аналогично для двух других команд.

Дэвид З
источник
1
#!/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
rechengehirn
источник
3
[и НЕ] являются частью синтаксиса. встроенная оболочка, псевдоним для . Причина, по которой вы заканчиваете это, - чтобы он выглядел симметрично. См. Mywiki.wooledge.org/BashFAQ/031 для получения дополнительной информации. ( Подсказка: хочешь просто и так далее.)if[test]if pvcreate /dev/md5
nyuszika7h
[pvcreate--- команда не найдена. Пожалуйста, отредактируйте или удалите этот ответ, он совершенно неправильный.
Rmano
@ myuszika7h я удалил []. Был набран в спешке.
rechengehirn
0

Если все команды зависят от одной перед выполнением, вы можете использовать set -e:

#!/bin/bash
set -e

pvcreate /dev/md5
vgcreate vg0 /dev/md5
lvcreate -L 200MB vg0 -n test

Обратите внимание, что вышеприведенное будет завершено без конкретного сообщения о том, какая команда не выполнена.

харакири
источник