Shell - 在IF中运行一堆命令

时间:2017-09-02 08:27:49

标签: linux shell if-statement

我想准备一个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"

4 个答案:

答案 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