我正在编写 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
请注意,上述操作将退出,并且不显示有关哪个命令失败的具体消息。