如果要检查命令是否成功

如果要检查命令是否成功

我正在编写 Bash 脚本来创建逻辑卷。我有这个命令,我想将其放入 if 中以检查每个命令是否成功。最简单的方法是什么?

 #!/bin/bash
 pvcreate /dev/md5

vgcreate vg0 /dev/md5

lvcreate -L 200MB vg0 -n test

答案1

#!/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)时才会执行逻辑 AND部分,否则||将执行逻辑 OR(false)部分。

答案2

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

来源:堆栈溢出

答案3

这将是传统的:

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

另外两个命令也类似。

答案4

如果所有命令都依赖于成功之前的命令,则可以使用set -e

#!/bin/bash
set -e

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

请注意,上述操作将退出,并且不显示有关哪个命令失败的具体消息。

相关内容