Se para um comando verificar se ele foi bem sucedido

4

Estou trabalhando no meu script bash para criar volumes lógicos. Eu tenho esse comando que eu quero colocar em um para verificar se cada um deles tem sucesso. Qual é a maneira mais fácil de fazer isso?

 #!/bin/bash
 pvcreate /dev/md5

vgcreate vg0 /dev/md5

lvcreate -L 200MB vg0 -n test
    
por user3185936 17.02.2014 / 13:12

5 respostas

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"

A parte lógica E && será executada apenas se o comando for bem-sucedido (true) else A parte Lógica OR || (false) será executada.

    
por Avinash Raj 17.02.2014 / 13:20
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"

Fonte: StackOverFlow

    
por m0rg4n 17.02.2014 / 13:38
1

Isso seria tradicional:

#!/bin/bash
pvcreate /dev/md5 || die "pvcreate failed"
vgcreate vg0 /dev/md5 || die "vgcreate failed"
lvcreate -L 200MB vg0 -n test || die "lvcreate failed"

A função die é algo que você terá que definir, que imprime uma mensagem de erro e, em seguida, sai. Uma implementação de amostra pode ser

die() {
     echo $@ 1>&2   # print arguments of 'die' to standard error
     exit 1         # exit the script
}

Quando você faz isso, o script não produz nenhum resultado, a menos que algo falhe e, nesse caso, ele não irá mais adiante. Se você quiser continuar, mesmo se um comando falhar, remova a linha exit da implementação de die .

Se você quiser receber uma mensagem para cada comando bem-sucedido, também poderá fazer isso:

#!/bin/bash
if pvcreate /dev/md5; then
    echo "pvcreate succeeded"
else
    echo "pvcreate failed"
fi

e de forma semelhante para os outros dois comandos.

    
por David Z 17.02.2014 / 22:01
1
#!/bin/bash
if pvcreate /dev/md5
then
  if vgcreate vg0 /dev/md5
  then
    lvcreate -L 200MB vg0 -n test
  fi
fi

Não testet. Mas deve funcionar.

A estrutura básica de if-else é:

if condition
  then
    do somethin...
fi
    
por rechengehirn 17.02.2014 / 13:17
0

Se todos os comandos dependerem do anterior, você poderá usar set -e :

#!/bin/bash
set -e

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

Observe que o acima sairá sem mensagem específica e em qual comando falhou.

    
por kiri 17.02.2014 / 22:06