我想准备一个shell脚本,如果我的所有命令都成功,它将执行我的所有命令,然后它将打印" SUCCESS"并且任何一个命令都失败然后打印" FAILED"。
我的shell脚本命令:
cd /home/lin
mkdir logs
cp /tmp/filelog.log logs/
rm /tmp/log*
touch /tmp/log
保存此文件test.sh
这是我的查询,
执行此操作时,如果我的任何一个命令失败,那么它应该停止执行并打印"失败"
Else print" SUCCESS"
答案 0 :(得分:2)
因为每个命令都依赖于它的前身,所以这是set -e
的完美用例。在子shell中执行所有工作,您只需要检查子shell的结果。
set -e
将在遇到第一个错误时退出当前shell。
(即,当返回非零退出状态时。)
(set -e
cd /home/lin
mkdir logs
cp /tmp/filelog.log logs/
rm /tmp/log*
touch /tmp/log
) && echo "SUCCESS" || echo "FAILED"
答案 1 :(得分:1)
正确脚本的示例
#!/bin/sh
die() { echo >&2 "$0 Err: $@" ; exit 1 ;}
cd /home/lin || die "Can't change to '/home/lin' dir"
mkdir logs || die "Can't create '$PWD/logs' dir"
cp /tmp/filelog.log logs/ || die "Can't copy 'filelog.log' to '$PWD/logs'"
rm /tmp/log* || die "Can't remove '/tmp/log*'"
touch /tmp/log || die "Can't touch /tmp/log"
echo SUCCESS: All done!
答案 2 :(得分:0)
创建一个可打印可选参数的功能。
stop()
{
if [ $# -gt 0 ]; then
echo "Failed: $@"
else
echo "Failed."
fi
exit 1
}
如果您不想编写太多代码,可以使用不带参数的函数。
cd /home/lin || stop
mkdir logs || stop
cp /tmp/filelog.log logs/ || stop
rm /tmp/log* || stop
touch /tmp/log || stop
echo Success
你可以投入更多精力。
第一个命令显示如何获取stderr并在输出中使用它。
errmsg=$(cd /home/lin 2>&1) || stop ${errmsg}
# You do not want an error when the dir already exists
mkdir -p logs || stop
# You can test in front
test -f /tmp/filelog.log || stop File filelog.log not found
cp /tmp/filelog.log logs/ || stop
rm -f /tmp/log* || stop
touch /tmp/log || stop
echo Success
其他可能性正在使用set -e
(将在失败后退出,但不会出现"失败"消息),这显示在@Kusalananda和@HenkLangeveld的答案中。
或者制作一系列命令:
cd /home/lin &&
mkdir -p logs &&
test -f /tmp/filelog.log &&
cp /tmp/filelog.log logs/ &&
rm -f /tmp/log* &&
touch /tmp/log || stop
答案 3 :(得分:0)
bash
(或ksh
)的解决方案:
#!/bin/bash
set -e
trap 'echo FAILED' ERR
mkdir test/test
# etc.
echo 'SUCCESS'
当ERR
(-e
)shell选项导致shell退出时,errexit
陷阱将执行,因为命令返回非零退出状态。
在mkdir test/test
失败的目录中测试此脚本:
bash-4.4$ bash script.sh
mkdir: test/test: No such file or directory
FAILED
在mkdir test/test
成功的目录中测试此脚本:
bash-4.4$ bash script.sh
SUCCESS